プロジェクトでSpring(boot)を使用しており、以下を使用してJMSキュー(ActiveMQ)にアクセスします。
@JmsListener(destination = "mydestinationQueue")
public void processMessage(String content) {
//do something
}
そしてそれは完全に機能しますが、このBeanをプログラムで停止/一時停止/開始できる必要があります(REST呼び出しなど)
このBeanを停止または一時停止するときは、現在のメッセージを完全に処理したことを確認したいと思います。
それについて何か考えはありますか?
ありがとう
これが私が見つけた解決策です
@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";
}
}
タイプJmsListenerEndpointRegistry
(名前_org.springframework.jms.config.internalJmsListenerEndpointRegistry
_)のBeanがあります。
レジストリから(すべてまたは名前で)JMSリスナーコンテナにアクセスし、必要なコンテナでstop()
を呼び出すことができます。処理中のメッセージが処理を完了すると、コンテナは停止します。
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();
}