SpringJMS - 如何优雅地关闭 DefaultMessageListenerContainer 以便所有消费者都被停止/杀死

问题描述 投票:0回答:1

DefaultMessageListenerContainer.shutdown 或 DefaultMessageListenerContainer.destroy 不会从队列中删除使用者。

这里有一篇类似的文章:SpringJMS - 如何断开 MessageListenerContainer

(我不知道如何解决)

下面是我的代码:

public class MainProgram {
 private static final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MessageConsumerFacade.class); 
 public static final DefaultMessageListenerContainer container = context.getBean(DefaultMessageListenerContainer.class); 


public static void main(String[] args) throws InterruptedException {
   boolean startListener = isStartListener();   // to start and stop listener at 
    will
   if(startListener){
     if (!container.isRunning()) {
       container.start(); 
     }
   }else{
      if (container.isRunning()) {
         container.stop();
   }
 }
}
}


public class MessageConsumerFacade {
private ConnectionFactory connectionFactory() {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        connectionFactory.setBrokerURL(url);
        connectionFactory.setUserName(userName);
        connectionFactory.setPassword(password);

        RedeliveryPolicy policy = connectionFactory.getRedeliveryPolicy();
        policy.setInitialRedeliveryDelay(30000);
        policy.setRedeliveryDelay(30000);
        policy.setMaximumRedeliveries(2);
        connectionFactory.setNonBlockingRedelivery(true);
        return connectionFactory;
    }

    @Bean
    public MessageListenerContainer listenerContainer() {
        DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
        container.setConnectionFactory(connectionFactory());
        container.setDestinationName(queueName);
        container.setMessageListener(new MessageJmsListener());
        container.setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE);
        container.setErrorHandler(new MessageErrorHandler());
        container.setSessionTransacted(true);
        container.setAutoStartup(false);
        container.shutdown();
        return container;
    }
}


public class MessageJmsListener implements MessageListener {
    
  @Override
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            try {
                //process the message and create record in Data Base                
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }     
}


public class MessageErrorHandler implements ErrorHandler {  
    
    @Override
    public void handleError(Throwable t) {
        //log error      
    }
}```
spring-jms shutdown consumer message-listener
1个回答
0
投票

shutDdwn()
之后致电
stop()

请参阅如何暂停/恢复单个 Spring JMS 消息侦听器

(顺便说一句,您在 bean 定义中对

shutdown()
的调用不会执行任何操作,因为它尚未启动)。

© www.soinside.com 2019 - 2024. All rights reserved.