【问题标题】:Unable to restart a DefaultMessageListenerContainer无法重新启动 DefaultMessageListenerContainer
【发布时间】:2017-04-07 19:31:42
【问题描述】:

我们正在使用 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();

我们希望消息会被再次处理,但事实并非如此,什么都没有发生(我们也没有收到任何异常和/或错误)。

我们的 bean 中是否有错误配置?为了手动停止/启动我们的容器,可能缺少什么?

【问题讨论】:

    标签: java spring jms spring-jms


    【解决方案1】:

    嗯...回答我自己...缺少的是对 afterPropertiesSet() 方法的调用。

    【讨论】:

    • 你也可以用stop()代替shutdown()
    猜你喜欢
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多