Fix error handling for connection establishment on the bridge.
This commit is contained in:
Timothy Bish 2016-06-23 11:03:06 -04:00
parent d563e9019d
commit 03785a4d53
2 changed files with 206 additions and 166 deletions

View File

@ -158,122 +158,142 @@ public class SimpleJmsQueueConnector extends JmsConnector {
@Override
protected void initializeForeignConnection() throws NamingException, JMSException {
final QueueConnection newConnection;
QueueConnection newConnection = null;
if (foreignConnection.get() == null) {
// get the connection factories
if (outboundQueueConnectionFactory == null) {
// look it up from JNDI
if (outboundQueueConnectionFactoryName != null) {
outboundQueueConnectionFactory = jndiOutboundTemplate
.lookup(outboundQueueConnectionFactoryName, QueueConnectionFactory.class);
try {
if (foreignConnection.get() == null) {
// get the connection factories
if (outboundQueueConnectionFactory == null) {
// look it up from JNDI
if (outboundQueueConnectionFactoryName != null) {
outboundQueueConnectionFactory = jndiOutboundTemplate
.lookup(outboundQueueConnectionFactoryName, QueueConnectionFactory.class);
if (outboundUsername != null) {
newConnection = outboundQueueConnectionFactory
.createQueueConnection(outboundUsername, outboundPassword);
} else {
newConnection = outboundQueueConnectionFactory.createQueueConnection();
}
} else {
throw new JMSException("Cannot create foreignConnection - no information");
}
} else {
if (outboundUsername != null) {
newConnection = outboundQueueConnectionFactory
.createQueueConnection(outboundUsername, outboundPassword);
} else {
newConnection = outboundQueueConnectionFactory.createQueueConnection();
}
} else {
throw new JMSException("Cannot create foreignConnection - no information");
}
} else {
if (outboundUsername != null) {
newConnection = outboundQueueConnectionFactory
.createQueueConnection(outboundUsername, outboundPassword);
} else {
newConnection = outboundQueueConnectionFactory.createQueueConnection();
// Clear if for now in case something goes wrong during the init.
newConnection = (QueueConnection) foreignConnection.getAndSet(null);
}
// Register for any async error notifications now so we can reset in the
// case where there's not a lot of activity and a connection drops.
newConnection.setExceptionListener(new ExceptionListener() {
@Override
public void onException(JMSException exception) {
handleConnectionFailure(foreignConnection.get());
}
});
if (outboundClientId != null && outboundClientId.length() > 0) {
newConnection.setClientID(getOutboundClientId());
}
} else {
// Clear if for now in case something goes wrong during the init.
newConnection = (QueueConnection) foreignConnection.getAndSet(null);
}
newConnection.start();
if (outboundClientId != null && outboundClientId.length() > 0) {
newConnection.setClientID(getOutboundClientId());
}
newConnection.start();
outboundMessageConvertor.setConnection(newConnection);
outboundMessageConvertor.setConnection(newConnection);
// Configure the bridges with the new Outbound connection.
initializeInboundDestinationBridgesOutboundSide(newConnection);
initializeOutboundDestinationBridgesOutboundSide(newConnection);
// Configure the bridges with the new Outbound connection.
initializeInboundDestinationBridgesOutboundSide(newConnection);
initializeOutboundDestinationBridgesOutboundSide(newConnection);
// Register for any async error notifications now so we can reset in the
// case where there's not a lot of activity and a connection drops.
newConnection.setExceptionListener(new ExceptionListener() {
@Override
public void onException(JMSException exception) {
handleConnectionFailure(newConnection);
// At this point all looks good, so this our current connection now.
foreignConnection.set(newConnection);
} catch (Exception ex) {
if (newConnection != null) {
try {
newConnection.close();
} catch (Exception ignore) {}
}
});
// At this point all looks good, so this our current connection now.
foreignConnection.set(newConnection);
throw ex;
}
}
@Override
protected void initializeLocalConnection() throws NamingException, JMSException {
final QueueConnection newConnection;
QueueConnection newConnection = null;
if (localConnection.get() == null) {
// get the connection factories
if (localQueueConnectionFactory == null) {
if (embeddedConnectionFactory == null) {
// look it up from JNDI
if (localConnectionFactoryName != null) {
localQueueConnectionFactory = jndiLocalTemplate
.lookup(localConnectionFactoryName, QueueConnectionFactory.class);
if (localUsername != null) {
newConnection = localQueueConnectionFactory
.createQueueConnection(localUsername, localPassword);
try {
if (localConnection.get() == null) {
// get the connection factories
if (localQueueConnectionFactory == null) {
if (embeddedConnectionFactory == null) {
// look it up from JNDI
if (localConnectionFactoryName != null) {
localQueueConnectionFactory = jndiLocalTemplate
.lookup(localConnectionFactoryName, QueueConnectionFactory.class);
if (localUsername != null) {
newConnection = localQueueConnectionFactory
.createQueueConnection(localUsername, localPassword);
} else {
newConnection = localQueueConnectionFactory.createQueueConnection();
}
} else {
newConnection = localQueueConnectionFactory.createQueueConnection();
throw new JMSException("Cannot create localConnection - no information");
}
} else {
throw new JMSException("Cannot create localConnection - no information");
newConnection = embeddedConnectionFactory.createQueueConnection();
}
} else {
newConnection = embeddedConnectionFactory.createQueueConnection();
if (localUsername != null) {
newConnection = localQueueConnectionFactory.
createQueueConnection(localUsername, localPassword);
} else {
newConnection = localQueueConnectionFactory.createQueueConnection();
}
}
} else {
if (localUsername != null) {
newConnection = localQueueConnectionFactory.
createQueueConnection(localUsername, localPassword);
} else {
newConnection = localQueueConnectionFactory.createQueueConnection();
// Clear if for now in case something goes wrong during the init.
newConnection = (QueueConnection) localConnection.getAndSet(null);
}
// Register for any async error notifications now so we can reset in the
// case where there's not a lot of activity and a connection drops.
newConnection.setExceptionListener(new ExceptionListener() {
@Override
public void onException(JMSException exception) {
handleConnectionFailure(localConnection.get());
}
});
if (localClientId != null && localClientId.length() > 0) {
newConnection.setClientID(getLocalClientId());
}
newConnection.start();
inboundMessageConvertor.setConnection(newConnection);
// Configure the bridges with the new Local connection.
initializeInboundDestinationBridgesLocalSide(newConnection);
initializeOutboundDestinationBridgesLocalSide(newConnection);
// At this point all looks good, so this our current connection now.
localConnection.set(newConnection);
} catch (Exception ex) {
if (newConnection != null) {
try {
newConnection.close();
} catch (Exception ignore) {}
}
} else {
// Clear if for now in case something goes wrong during the init.
newConnection = (QueueConnection) localConnection.getAndSet(null);
throw ex;
}
if (localClientId != null && localClientId.length() > 0) {
newConnection.setClientID(getLocalClientId());
}
newConnection.start();
inboundMessageConvertor.setConnection(newConnection);
// Configure the bridges with the new Local connection.
initializeInboundDestinationBridgesLocalSide(newConnection);
initializeOutboundDestinationBridgesLocalSide(newConnection);
// Register for any async error notifications now so we can reset in the
// case where there's not a lot of activity and a connection drops.
newConnection.setExceptionListener(new ExceptionListener() {
@Override
public void onException(JMSException exception) {
handleConnectionFailure(newConnection);
}
});
// At this point all looks good, so this our current connection now.
localConnection.set(newConnection);
}
protected void initializeInboundDestinationBridgesOutboundSide(QueueConnection connection) throws JMSException {

View File

@ -157,122 +157,142 @@ public class SimpleJmsTopicConnector extends JmsConnector {
@Override
protected void initializeForeignConnection() throws NamingException, JMSException {
final TopicConnection newConnection;
TopicConnection newConnection = null;
if (foreignConnection.get() == null) {
// get the connection factories
if (outboundTopicConnectionFactory == null) {
// look it up from JNDI
if (outboundTopicConnectionFactoryName != null) {
outboundTopicConnectionFactory = jndiOutboundTemplate
.lookup(outboundTopicConnectionFactoryName, TopicConnectionFactory.class);
try {
if (foreignConnection.get() == null) {
// get the connection factories
if (outboundTopicConnectionFactory == null) {
// look it up from JNDI
if (outboundTopicConnectionFactoryName != null) {
outboundTopicConnectionFactory = jndiOutboundTemplate
.lookup(outboundTopicConnectionFactoryName, TopicConnectionFactory.class);
if (outboundUsername != null) {
newConnection = outboundTopicConnectionFactory
.createTopicConnection(outboundUsername, outboundPassword);
} else {
newConnection = outboundTopicConnectionFactory.createTopicConnection();
}
} else {
throw new JMSException("Cannot create foreignConnection - no information");
}
} else {
if (outboundUsername != null) {
newConnection = outboundTopicConnectionFactory
.createTopicConnection(outboundUsername, outboundPassword);
} else {
newConnection = outboundTopicConnectionFactory.createTopicConnection();
}
} else {
throw new JMSException("Cannot create foreignConnection - no information");
}
} else {
if (outboundUsername != null) {
newConnection = outboundTopicConnectionFactory
.createTopicConnection(outboundUsername, outboundPassword);
} else {
newConnection = outboundTopicConnectionFactory.createTopicConnection();
// Clear if for now in case something goes wrong during the init.
newConnection = (TopicConnection) foreignConnection.getAndSet(null);
}
// Register for any async error notifications now so we can reset in the
// case where there's not a lot of activity and a connection drops.
newConnection.setExceptionListener(new ExceptionListener() {
@Override
public void onException(JMSException exception) {
handleConnectionFailure(foreignConnection.get());
}
});
if (outboundClientId != null && outboundClientId.length() > 0) {
newConnection.setClientID(getOutboundClientId());
}
} else {
// Clear if for now in case something goes wrong during the init.
newConnection = (TopicConnection) foreignConnection.getAndSet(null);
}
newConnection.start();
if (outboundClientId != null && outboundClientId.length() > 0) {
newConnection.setClientID(getOutboundClientId());
}
newConnection.start();
outboundMessageConvertor.setConnection(newConnection);
outboundMessageConvertor.setConnection(newConnection);
// Configure the bridges with the new Outbound connection.
initializeInboundDestinationBridgesOutboundSide(newConnection);
initializeOutboundDestinationBridgesOutboundSide(newConnection);
// Configure the bridges with the new Outbound connection.
initializeInboundDestinationBridgesOutboundSide(newConnection);
initializeOutboundDestinationBridgesOutboundSide(newConnection);
// Register for any async error notifications now so we can reset in the
// case where there's not a lot of activity and a connection drops.
newConnection.setExceptionListener(new ExceptionListener() {
@Override
public void onException(JMSException exception) {
handleConnectionFailure(newConnection);
// At this point all looks good, so this our current connection now.
foreignConnection.set(newConnection);
} catch (Exception ex) {
if (newConnection != null) {
try {
newConnection.close();
} catch (Exception ignore) {}
}
});
// At this point all looks good, so this our current connection now.
foreignConnection.set(newConnection);
throw ex;
}
}
@Override
protected void initializeLocalConnection() throws NamingException, JMSException {
final TopicConnection newConnection;
TopicConnection newConnection = null;
if (localConnection.get() == null) {
// get the connection factories
if (localTopicConnectionFactory == null) {
if (embeddedConnectionFactory == null) {
// look it up from JNDI
if (localConnectionFactoryName != null) {
localTopicConnectionFactory = jndiLocalTemplate
.lookup(localConnectionFactoryName, TopicConnectionFactory.class);
if (localUsername != null) {
newConnection = localTopicConnectionFactory
.createTopicConnection(localUsername, localPassword);
try {
if (localConnection.get() == null) {
// get the connection factories
if (localTopicConnectionFactory == null) {
if (embeddedConnectionFactory == null) {
// look it up from JNDI
if (localConnectionFactoryName != null) {
localTopicConnectionFactory = jndiLocalTemplate
.lookup(localConnectionFactoryName, TopicConnectionFactory.class);
if (localUsername != null) {
newConnection = localTopicConnectionFactory
.createTopicConnection(localUsername, localPassword);
} else {
newConnection = localTopicConnectionFactory.createTopicConnection();
}
} else {
newConnection = localTopicConnectionFactory.createTopicConnection();
throw new JMSException("Cannot create localConnection - no information");
}
} else {
throw new JMSException("Cannot create localConnection - no information");
newConnection = embeddedConnectionFactory.createTopicConnection();
}
} else {
newConnection = embeddedConnectionFactory.createTopicConnection();
if (localUsername != null) {
newConnection = localTopicConnectionFactory.
createTopicConnection(localUsername, localPassword);
} else {
newConnection = localTopicConnectionFactory.createTopicConnection();
}
}
} else {
if (localUsername != null) {
newConnection = localTopicConnectionFactory.
createTopicConnection(localUsername, localPassword);
} else {
newConnection = localTopicConnectionFactory.createTopicConnection();
// Clear if for now in case something goes wrong during the init.
newConnection = (TopicConnection) localConnection.getAndSet(null);
}
// Register for any async error notifications now so we can reset in the
// case where there's not a lot of activity and a connection drops.
newConnection.setExceptionListener(new ExceptionListener() {
@Override
public void onException(JMSException exception) {
handleConnectionFailure(localConnection.get());
}
});
if (localClientId != null && localClientId.length() > 0) {
newConnection.setClientID(getLocalClientId());
}
newConnection.start();
inboundMessageConvertor.setConnection(newConnection);
// Configure the bridges with the new Local connection.
initializeInboundDestinationBridgesLocalSide(newConnection);
initializeOutboundDestinationBridgesLocalSide(newConnection);
// At this point all looks good, so this our current connection now.
localConnection.set(newConnection);
} catch (Exception ex) {
if (newConnection != null) {
try {
newConnection.close();
} catch (Exception ignore) {}
}
} else {
// Clear if for now in case something goes wrong during the init.
newConnection = (TopicConnection) localConnection.getAndSet(null);
throw ex;
}
if (localClientId != null && localClientId.length() > 0) {
newConnection.setClientID(getLocalClientId());
}
newConnection.start();
inboundMessageConvertor.setConnection(newConnection);
// Configure the bridges with the new Local connection.
initializeInboundDestinationBridgesLocalSide(newConnection);
initializeOutboundDestinationBridgesLocalSide(newConnection);
// Register for any async error notifications now so we can reset in the
// case where there's not a lot of activity and a connection drops.
newConnection.setExceptionListener(new ExceptionListener() {
@Override
public void onException(JMSException exception) {
handleConnectionFailure(newConnection);
}
});
// At this point all looks good, so this our current connection now.
localConnection.set(newConnection);
}
protected void initializeInboundDestinationBridgesOutboundSide(TopicConnection connection) throws JMSException {