public ConnectionEntry createConnectionEntry(final Connection connection)
{
final Configuration config = server.getConfiguration();
final CoreRemotingConnection rc = new RemotingConnectionImpl(connection,
interceptors,
config.isAsyncConnectionExecutionEnabled() ? server.getExecutorFactory()
.getExecutor()
: null,
server.getNodeID());
Channel channel1 = rc.getChannel(1, -1);
ChannelHandler handler = new HornetQPacketHandler(this, server, channel1, rc);
channel1.setHandler(handler);
long ttl = HornetQClient.DEFAULT_CONNECTION_TTL;
if (config.getConnectionTTLOverride() != -1)
{
ttl = config.getConnectionTTLOverride();
}
final ConnectionEntry entry = new ConnectionEntry(rc, System.currentTimeMillis(), ttl);
final Channel channel0 = rc.getChannel(0, -1);
channel0.setHandler(new ChannelHandler()
{
public void handlePacket(final Packet packet)
{
if (packet.getType() == PacketImpl.PING)
{
Ping ping = (Ping)packet;
if (config.getConnectionTTLOverride() == -1)
{
// Allow clients to specify connection ttl
entry.ttl = ping.getConnectionTTL();
}
// Just send a ping back
channel0.send(packet);
}
else if (packet.getType() == PacketImpl.SUBSCRIBE_TOPOLOGY)
{
SubscribeClusterTopologyUpdatesMessage msg = (SubscribeClusterTopologyUpdatesMessage)packet;
final ClusterTopologyListener listener = new ClusterTopologyListener()
{
public void nodeUP(String nodeID, Pair<TransportConfiguration, TransportConfiguration> connectorPair, boolean last)
{
channel0.send(new ClusterTopologyChangeMessage(nodeID, connectorPair, last));
}
public void nodeDown(String nodeID)
{
channel0.send(new ClusterTopologyChangeMessage(nodeID));
}
};
final boolean isCC = msg.isClusterConnection();
server.getClusterManager().addClusterTopologyListener(listener, isCC);
rc.addCloseListener(new CloseListener()
{
public void connectionClosed()
{
server.getClusterManager().removeClusterTopologyListener(listener, isCC);
}