我怎样才能停止/启动/暂停@JmsListener(干净的方式)

Posted

技术标签:

【中文标题】我怎样才能停止/启动/暂停@JmsListener(干净的方式)【英文标题】:How can I Stop/start/Pause a @JmsListener (the clean way) 【发布时间】:2015-12-11 20:16:43 【问题描述】:

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

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

它工作得很好,但我需要能够以编程方式停止/暂停/启动这个 bean(一个 REST 调用或类似的东西)

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

对此有什么想法吗?

谢谢

【问题讨论】:

【参考方案1】:

这是我找到的解决方案

@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";



【讨论】:

嗨,谢谢分享。它适用于 2 位听众吗?是否手动设置 bean 名称? 一个老话题,但仍然适用。 stopApp() 方法尝试启动一个新应用程序,然后关闭它,而不是当前正在运行的应用程序。我相信 SpringApplication.exit(context) 是用于此目的的。【参考方案2】:

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

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

【讨论】:

感谢您的回答,我会试一试告诉您 @Seb 有什么消息吗? 5年过去了,我的胡子越来越白了。【参考方案3】:
   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();
    

【讨论】:

以上是关于我怎样才能停止/启动/暂停@JmsListener(干净的方式)的主要内容,如果未能解决你的问题,请参考以下文章

如何在启动时以编程方式禁用 Spring @JmsListener

我如何在python中暂停录制屏幕

Sinch 暂停传出的音频或视频

在 qt 中使用 QThread 实现启动/停止/暂停

播放背景音乐,用户可以停止或重新启动或暂停音乐

如何暂停、停止和重置 AUFilePlayer?