无法重新启动 DefaultMessageListenerContainer
Unable to restart a DefaultMessageListenerContainer
我们正在使用 Spring 4.3.1,并使用以下 bean 从队列中获取消息:
@Bean(name="listenerContainer")
public SprMessageListenerContainer listenerContainer() throws JMSException, SQLException {
SprMessageListenerContainer listenerContainer = new SprMessageListenerContainer();
listenerContainer.setConnectionFactory((ConnectionFactory) connectionFactory());
listenerContainer.setMessageListener(messageListener());
listenerContainer.setSessionTransacted(true);
listenerContainer.setCacheLevel(0);
listenerContainer.setMaxConcurrentConsumers(3);
listenerContainer.setDestinationName("ourQueue");
// (April 2017): we provide the possibility to manually stop/start the listner container > autostart needs to be set to false, otherwise we can only stop the container, but not restart it anymore
// see: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/listener/AbstractJmsListeningContainer.html#setAutoStartup-boolean-
listenerContainer.setTransactionManager(jmsTransactionManager());
listenerContainer.setAutoStartup(false);
listenerContainer.start();
Assert.isTrue(listenerContainer.isRunning());
return listenerContainer;
}
@Bean(name="connectionFactory")
public ConnectionFactory connectionFactory() throws JMSException, SQLException {
return AQjmsFactory.getConnectionFactory(dataSourceConfig.gpDataSourceAdapter());
}
private JmsTransactionManager jmsTransactionManager() throws JMSException, SQLException {
JmsTransactionManager transactionManager = new JmsTransactionManager();
transactionManager.setConnectionFactory(connectionFactory());
return transactionManager;
}
SprMessageListenerContainer 是:
public class SprMessageListenerContainer extends DefaultMessageListenerContainer {
@Override
protected MessageConsumer createConsumer(Session session, Destination destination) throws JMSException {
return ((AQjmsSession) session).createConsumer(destination, null, new SprORADataFactory(), null, false);
}
@Override
protected void doShutdown() throws JMSException {
logger.info("Shutting done.");
}
}
在我们的应用程序中,我们正确地获得了对 listenerContainer bean 的引用。当应用程序启动时,侦听器正确启动,我们看到消息得到处理。
在我们的代码中,只要我们这样做:
listenerContainer.shutdown();
然后,将不再处理任何消息 > 预期。
但是,在我们的代码中,我们做了:
listenerContainer.start();
我们希望再次处理消息,但事实并非如此,什么也没发生(我们也没有收到任何异常 and/or 错误)。
是不是我们的bean配置有问题?为了手动 stop/start 我们的容器可能缺少什么?
好吧...自己回答...缺少的是对 afterPropertiesSet() 方法的调用。
我们正在使用 Spring 4.3.1,并使用以下 bean 从队列中获取消息:
@Bean(name="listenerContainer")
public SprMessageListenerContainer listenerContainer() throws JMSException, SQLException {
SprMessageListenerContainer listenerContainer = new SprMessageListenerContainer();
listenerContainer.setConnectionFactory((ConnectionFactory) connectionFactory());
listenerContainer.setMessageListener(messageListener());
listenerContainer.setSessionTransacted(true);
listenerContainer.setCacheLevel(0);
listenerContainer.setMaxConcurrentConsumers(3);
listenerContainer.setDestinationName("ourQueue");
// (April 2017): we provide the possibility to manually stop/start the listner container > autostart needs to be set to false, otherwise we can only stop the container, but not restart it anymore
// see: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/listener/AbstractJmsListeningContainer.html#setAutoStartup-boolean-
listenerContainer.setTransactionManager(jmsTransactionManager());
listenerContainer.setAutoStartup(false);
listenerContainer.start();
Assert.isTrue(listenerContainer.isRunning());
return listenerContainer;
}
@Bean(name="connectionFactory")
public ConnectionFactory connectionFactory() throws JMSException, SQLException {
return AQjmsFactory.getConnectionFactory(dataSourceConfig.gpDataSourceAdapter());
}
private JmsTransactionManager jmsTransactionManager() throws JMSException, SQLException {
JmsTransactionManager transactionManager = new JmsTransactionManager();
transactionManager.setConnectionFactory(connectionFactory());
return transactionManager;
}
SprMessageListenerContainer 是:
public class SprMessageListenerContainer extends DefaultMessageListenerContainer {
@Override
protected MessageConsumer createConsumer(Session session, Destination destination) throws JMSException {
return ((AQjmsSession) session).createConsumer(destination, null, new SprORADataFactory(), null, false);
}
@Override
protected void doShutdown() throws JMSException {
logger.info("Shutting done.");
}
}
在我们的应用程序中,我们正确地获得了对 listenerContainer bean 的引用。当应用程序启动时,侦听器正确启动,我们看到消息得到处理。
在我们的代码中,只要我们这样做:
listenerContainer.shutdown();
然后,将不再处理任何消息 > 预期。
但是,在我们的代码中,我们做了:
listenerContainer.start();
我们希望再次处理消息,但事实并非如此,什么也没发生(我们也没有收到任何异常 and/or 错误)。
是不是我们的bean配置有问题?为了手动 stop/start 我们的容器可能缺少什么?
好吧...自己回答...缺少的是对 afterPropertiesSet() 方法的调用。