如何停止/启动/暂停@JmsListener(干净的方式)

时间:2015-09-15 14:12:48

标签: spring-boot jms spring-jms message-listener

我在我的项目中使用Spring(boot)并使用以下方法访问JMS队列(ActiveMQ):

@JmsListener(destination = "mydestinationQueue")
public void processMessage(String content) {
    //do something
}

它运行良好,但我需要能够以编程方式停止/暂停/启动此bean(REST调用或类似的东西)

当我停止或暂停这个bean时,我想确保完全处理当前消息。

对此有何看法?

谢谢

3 个答案:

答案 0 :(得分:7)

这是我找到的解决方案

@RestController
@RequestMapping("/jms")
public class JmsController {

     @Autowired
     ApplicationContext context;

@RequestMapping(value="/halt", method= RequestMethod.GET)
public @ResponseBody
String haltJmsListener() {
    JmsListenerEndpointRegistry customRegistry =
            context.getBean("jmsRegistry", JmsListenerEndpointRegistry.class);
    customRegistry.stop();
    return "Jms Listener Stopped";
}

@RequestMapping(value="/restart", method=RequestMethod.GET)
public @ResponseBody
String reStartJmsListener() {
    JmsListenerEndpointRegistry customRegistry =
            context.getBean("jmsRegistry", JmsListenerEndpointRegistry.class);
    customRegistry.start();
    return "Jms Listener restarted";
}

@RequestMapping(value="/stopApp", method=RequestMethod.GET)
public @ResponseBody
String stopApp() {
    String[] args={};
    SpringApplication.run(FacturationApplicationFrontDaemon.class, args).close();
    return "stopped";
}

}

答案 1 :(得分:5)

有一个JmsListenerEndpointRegistry类型的bean(名称org.springframework.jms.config.internalJmsListenerEndpointRegistry)。

您可以从注册表(全部或按名称)访问JMS侦听器容器,并在所需的一个({1)上调用stop();在任何进程内消息完成处理后,容器将停止。

答案 2 :(得分:0)

   private void stopJMSListener() {
       if(null == customRegistry){
           customRegistry = context.getBean(JmsListenerEndpointRegistry.class);
       }
        customRegistry.stop();
    }

   private void startJMSListener() {
       if(null == customRegistry){
        JmsListenerEndpointRegistry customRegistry = context.getBean(JmsListenerEndpointRegistry.class);
       }
        customRegistry.start();
    }