web-dev-qa-db-ja.com

@JmsListenerを停止/開始/一時停止するにはどうすればよいですか(クリーンな方法)

プロジェクトでSpring(boot)を使用しており、以下を使用してJMSキュー(ActiveMQ)にアクセスします。

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

そしてそれは完全に機能しますが、このBeanをプログラムで停止/一時停止/開始できる必要があります(REST呼び出しなど)

このBeanを停止または一時停止するときは、現在のメッセージを完全に処理したことを確認したいと思います。

それについて何か考えはありますか?

ありがとう

10
Seb

これが私が見つけた解決策です

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

}
11
Seb

タイプJmsListenerEndpointRegistry(名前_org.springframework.jms.config.internalJmsListenerEndpointRegistry_)のBeanがあります。

レジストリから(すべてまたは名前で)JMSリスナーコンテナにアクセスし、必要なコンテナでstop()を呼び出すことができます。処理中のメッセージが処理を完了すると、コンテナは停止します。

6
Gary Russell
   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();
    }
0
Prabin