Lock lock = null;
try
{
Channel channel1;
synchronized (failoverLock)
{
if (connection == null)
{
throw new IllegalStateException("Connection is null");
}
channel1 = connection.getChannel(1, -1);
// Lock it - this must be done while the failoverLock is held
while (!channel1.getLock().tryLock(100, TimeUnit.MILLISECONDS))
{
if (exitLoop)
throw HornetQClientMessageBundle.BUNDLE.clientSessionClosed();
}
lock = channel1.getLock();
} // We can now release the failoverLock
// We now set a flag saying createSession is executing
synchronized (inCreateSessionGuard)
{
if (exitLoop)
throw HornetQClientMessageBundle.BUNDLE.clientSessionClosed();
inCreateSession = true;
inCreateSessionLatch = new CountDownLatch(1);
}
long sessionChannelID = connection.generateChannelID();
Packet request = new CreateSessionMessage(name,
sessionChannelID,
clientVersion.getIncrementingVersion(),
username,
password,
serverLocator.getMinLargeMessageSize(),
xa,
autoCommitSends,
autoCommitAcks,
preAcknowledge,
serverLocator.getConfirmationWindowSize(),
null);
Packet pResponse;
try
{
pResponse = channel1.sendBlocking(request);
}
catch (HornetQException e)
{
if (e.getType() == HornetQExceptionType.INCOMPATIBLE_CLIENT_SERVER_VERSIONS)
{
connection.destroy();
}
if (exitLoop)
throw e;
if (e.getType() == HornetQExceptionType.UNBLOCKED)
{
// This means the thread was blocked on create session and failover unblocked it
// so failover could occur
retry = true;
continue;
}
else
{
throw e;
}
}
CreateSessionResponseMessage response = (CreateSessionResponseMessage)pResponse;
Channel sessionChannel = connection.getChannel(sessionChannelID,
serverLocator.getConfirmationWindowSize());
ClientSessionInternal session = new ClientSessionImpl(this,
name,
username,
password,
xa,
autoCommitSends,
autoCommitAcks,
preAcknowledge,
serverLocator.isBlockOnAcknowledge(),
serverLocator.isAutoGroup(),
ackBatchSize,
serverLocator.getConsumerWindowSize(),
serverLocator.getConsumerMaxRate(),
serverLocator.getConfirmationWindowSize(),
serverLocator.getProducerWindowSize(),
serverLocator.getProducerMaxRate(),
serverLocator.isBlockOnNonDurableSend(),
serverLocator.isBlockOnDurableSend(),
serverLocator.isCacheLargeMessagesClient(),
serverLocator.getMinLargeMessageSize(),
serverLocator.isCompressLargeMessage(),
serverLocator.getInitialMessagePacketSize(),
serverLocator.getGroupID(),
connection,
response.getServerVersion(),
sessionChannel,
orderedExecutorFactory.getExecutor(),
orderedExecutorFactory.getExecutor());
synchronized (sessions)
{
if (closed || exitLoop)
{
session.close();
return null;
}
sessions.add(session);
}
ChannelHandler handler = new ClientSessionPacketHandler(session, sessionChannel);
sessionChannel.setHandler(handler);
return new DelegatingSession(session);
}
catch (Throwable t)
{