我有一个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中停止应用程序会起作用,但显然应用程序认为监听器仍在处理消息,因此不会停止。
提前致谢