Spring:仍在等待1个消息监听器调用者的关闭

时间:2017-09-14 13:53:46

标签: java spring jms spring-jms

我有一个Spring Boot应用程序,以编程方式启动一些JMS侦听器。从配置:

@Override
public void configureJmsListeners(final JmsListenerEndpointRegistrar registrar) {
    final List<String> allQueueNames = getAllQueueNames();
    for (final String queueName : allQueueNames) {
        LOG.info("Creating JMSListener for queueName: '{}'", queueName);
        final SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
        endpoint.setId(queueName + "_endpoint");
        endpoint.setDestination(queueName);
        endpoint.setMessageListener(message -> onMessage((TextMessage) message));
        registrar.registerEndpoint(endpoint);
    }
}

@Bean
@Override
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(
        final ConnectionFactory connectionFactory,
        final DefaultJmsListenerContainerFactoryConfigurer defaultJmsListenerContainerFactoryConfigurer) {
    final DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setSessionTransacted(true);
    factory.setErrorHandler(t -> errorService.handleException(t));
    defaultJmsListenerContainerFactoryConfigurer.configure(factory, connectionFactory);

    return factory;
}

鉴于某些情况,例如db失败,我必须阻止侦听器处理更多消息并停止APP。

我使用errorService中的以下内容来停止应用程序:

    ((ConfigurableApplicationContext)(this).applicationContext).close();

然而,由于以下原因,申请不会停止:

Still waiting for shutdown of 1 message listener invokers

......永远重复。

有没有办法在处理JMS消息期间停止应用程序?我认为在Listeners errorHandler中停止应用程序会起作用,但显然应用程序认为监听器仍在处理消息,因此不会停止。

提前致谢

0 个答案:

没有答案