I'm trying to use DefaultMessageListenerContainer with ActiveMQ in a specific configuration : the ActiveMQ configuration is loaded dynamically after the broker has started. However one of the application is already started before the configuration is loaded and that application tries to connect to a queue to which it initially doesn't have access (user not existing).
The connection is done using a DefaultMessageListenerContainer. The error we're seeing is following:
DefaultMessageListenerContainer - Could not refresh JMS Connection for destination 'js04.admin.adminweb' - retrying using FixedBackOff{inter val=5000, currentAttempts=7, maxAttempts=unlimited}. Cause: The JMS connection has failed: Socket closed
Once the final configuration is loaded into the broker, the error keeps on occuring even though all the rights are in place (we're able to connect using a DefaultMessageListenerContainer with the same parameters created after the configuration is in place).
I've done some researches and found that the exception sometimes didn't trigger a socket reconnection, so I've updated my DefaultMessageListenerContainer with an ExceptionListener, but that didn't improve it.
Here's the declaration of my beans:
@Bean
public ConnectionFactory jmsFactory() {
final org.apache.activemq.ActiveMQConnectionFactory activeMQConnectionFactory = new org.apache.activemq.ActiveMQConnectionFactory();
activeMQConnectionFactory.setBrokerURL(brokerURL);
activeMQConnectionFactory.setUserName(jmsUserUsername);
activeMQConnectionFactory.setPassword(jmsUserPassword);
return activeMQConnectionFactory;
}
@Bean
public org.springframework.jms.connection.CachingConnectionFactory jmsConsumerConnectionFactory() {
final org.springframework.jms.connection.CachingConnectionFactory singleConnectionFactory = new org.springframework.jms.connection.CachingConnectionFactory(
jmsFactory());
return singleConnectionFactory;
}
@Bean
public org.apache.activemq.command.ActiveMQQueue queueName() {
return new org.apache.activemq.command.ActiveMQQueue(QueueHelper.adminQueue(journalingID, backend.getComponentType().Value));
}
@Bean
public org.springframework.jms.core.JmsTemplate jmsTemplate() {
final JmsTemplate template = new org.springframework.jms.core.JmsTemplate();
template.setConnectionFactory(jmsConsumerConnectionFactory());
template.setDefaultDestination(queueName());
template.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return template;
}
@Bean
public AdminQueueMessageListener adminQueueMessageListener() {
return new AdminQueueMessageListener(backend, journalingID, jmsTemplate());
}
@Bean
public QueueHelper queueHelper() {
return new QueueHelper();
}
@Bean
public DefaultMessageListenerContainer msgListenerContainer() {
final DefaultMessageListenerContainer msgListenerContainer = new DefaultMessageListenerContainer();
msgListenerContainer.setExceptionListener(jmsConsumerConnectionFactory());
msgListenerContainer.setConcurrentConsumers(1);
msgListenerContainer.setMaxConcurrentConsumers(1);
msgListenerContainer.setReceiveTimeout(5000);
msgListenerContainer.setIdleConsumerLimit(1);
msgListenerContainer.setIdleConsumerLimit(5);
msgListenerContainer.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
msgListenerContainer.setSessionTransacted(true);
msgListenerContainer.setConnectionFactory(jmsConsumerConnectionFactory());
msgListenerContainer.setDestinationName("");
msgListenerContainer.setMessageListener(adminQueueMessageListener());
return msgListenerContainer;
}
Any idea as to why the connection is not successful once the broker is loaded with the correct configuration ?
Edit: got the stack trace
.15:57:41.767 [msgListenerContainer-1] ERROR o.s.j.l.DefaultMessageListenerContainer - Could not refresh JMS Connection for destination 'ci01.admin.adminweb' - retrying using FixedBackOff{interval=5000, currentAttempts=2, maxAttempts=unlimited}. Cause: The JMS connection has failed: socket closed
org.apache.activemq.ConnectionFailedException: The JMS connection has failed: socket closed
at org.apache.activemq.ActiveMQConnection.checkClosedOrFailed(ActiveMQConnection.java:1466) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:523) ~[activemq-client-5.8.0.jar:5.8.0]
at org.springframework.jms.connection.SingleConnectionFactory$SharedConnectionInvocationHandler.localStart(SingleConnectionFactory.java:632) ~[spring-jms-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at org.springframework.jms.connection.SingleConnectionFactory$SharedConnectionInvocationHandler.invoke(SingleConnectionFactory.java:569) ~[spring-jms-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at com.sun.proxy.$Proxy50.start(Unknown Source) ~[na:na]
at org.springframework.jms.listener.AbstractJmsListeningContainer.refreshSharedConnection(AbstractJmsListeningContainer.java:400) ~[spring-jms-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer.refreshConnectionUntilSuccessful(DefaultMessageListenerContainer.java:907) [spring-jms-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer.recoverAfterListenerSetupFailure(DefaultMessageListenerContainer.java:882) [spring-jms-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1053) [spring-jms-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at java.lang.Thread.run(Thread.java:722) [na:1.7.0_21]
Caused by: java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.7.0_21]
at java.net.SocketInputStream.read(SocketInputStream.java:150) ~[na:1.7.0_21]
at java.net.SocketInputStream.read(SocketInputStream.java:121) ~[na:1.7.0_21]
at org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.java:604) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:58) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.transport.tcp.TcpTransport$2.read(TcpTransport.java:589) ~[activemq-client-5.8.0.jar:5.8.0]
at java.io.DataInputStream.readInt(DataInputStream.java:387) ~[na:1.7.0_21]
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:221) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:213) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) ~[activemq-client-5.8.0.jar:5.8.0]
... 1 common frames omitted
.15:57:46.898 [msgListenerContainer-1] ERROR o.s.j.l.DefaultMessageListenerContainer - Could not refresh JMS Connection for destination 'ci01.admin.adminweb' - retrying using FixedBackOff{interval=5000, currentAttempts=3, maxAttempts=unlimited}. Cause: The JMS connection has failed: socket closed
org.apache.activemq.ConnectionFailedException: The JMS connection has failed: socket closed
at org.apache.activemq.ActiveMQConnection.checkClosedOrFailed(ActiveMQConnection.java:1466) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:523) ~[activemq-client-5.8.0.jar:5.8.0]
at org.springframework.jms.connection.SingleConnectionFactory$SharedConnectionInvocationHandler.localStart(SingleConnectionFactory.java:632) ~[spring-jms-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at org.springframework.jms.connection.SingleConnectionFactory$SharedConnectionInvocationHandler.invoke(SingleConnectionFactory.java:569) ~[spring-jms-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at com.sun.proxy.$Proxy50.start(Unknown Source) ~[na:na]
at org.springframework.jms.listener.AbstractJmsListeningContainer.refreshSharedConnection(AbstractJmsListeningContainer.java:400) ~[spring-jms-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer.refreshConnectionUntilSuccessful(DefaultMessageListenerContainer.java:907) [spring-jms-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer.recoverAfterListenerSetupFailure(DefaultMessageListenerContainer.java:882) [spring-jms-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1053) [spring-jms-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at java.lang.Thread.run(Thread.java:722) [na:1.7.0_21]
Caused by: java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.7.0_21]
at java.net.SocketInputStream.read(SocketInputStream.java:150) ~[na:1.7.0_21]
at java.net.SocketInputStream.read(SocketInputStream.java:121) ~[na:1.7.0_21]
at org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.java:604) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:58) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.transport.tcp.TcpTransport$2.read(TcpTransport.java:589) ~[activemq-client-5.8.0.jar:5.8.0]
at java.io.DataInputStream.readInt(DataInputStream.java:387) ~[na:1.7.0_21]
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:221) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:213) ~[activemq-client-5.8.0.jar:5.8.0]
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) ~[activemq-client-5.8.0.jar:5.8.0]
... 1 common frames omitted
Also, the error only occurs when the user is not defined in the ActiveMQ config file when the DefaultMessageListenerContainer is created. If the user exists but doesn't have access to the queue, the error generated is different and the connection is successfully recovered when the broker's configuration is corrected.
Aucun commentaire:
Enregistrer un commentaire