in proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java [123:184]
private void handleBound(Reactor reactor, Event event) {
Connection connection = event.getConnection();
Record conn_recs = connection.attachments();
if (conn_recs.get(AcceptorImpl.CONNECTION_ACCEPTOR_KEY, Acceptor.class) != null) {
// Connection was created via the Acceptor, so the socket already
// exists
return;
}
String url = reactor.getConnectionAddress(connection);
String hostname = connection.getHostname();
int port = 5672;
if (url != null) {
Address address = new Address(url);
hostname = address.getHost();
try {
port = Integer.parseInt(address.getImpliedPort());
} catch(NumberFormatException nfe) {
throw new IllegalArgumentException("Not a valid host: " + url, nfe);
}
} else if (hostname != null && !hostname.equals("")) {
// Backward compatibility with old code that illegally overloaded
// the connection's hostname
int colonIndex = hostname.indexOf(':');
if (colonIndex >= 0) {
try {
port = Integer.parseInt(hostname.substring(colonIndex+1));
} catch(NumberFormatException nfe) {
throw new IllegalArgumentException("Not a valid host: " + hostname, nfe);
}
hostname = hostname.substring(0, colonIndex);
}
} else {
throw new IllegalStateException("No address provided for Connection");
}
Transport transport = event.getConnection().getTransport();
Socket socket = null; // In this case, 'null' is the proton-j equivalent of PN_INVALID_SOCKET
SocketChannel socketChannel = null;
try {
socketChannel = ((ReactorImpl)reactor).getIO().socketChannel();
socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress(hostname, port));
socket = socketChannel.socket();
} catch(Exception exception) {
if (socketChannel != null) {
try {
socketChannel.close();
} catch (IOException e) {
//ignore
}
}
ErrorCondition condition = new ErrorCondition();
condition.setCondition(Symbol.getSymbol("proton:io"));
condition.setDescription(exception.getMessage());
transport.setCondition(condition);
transport.close_tail();
transport.close_head();
transport.pop(Math.max(0, transport.pending())); // Force generation of TRANSPORT_HEAD_CLOSE (not in C code)
}
selectableTransport(reactor, socket, transport);
}