我在我的项目上使用了Spring(引导),并且我使用以下命令访问JMS队列(ActiveMQ):
@JmsListener(destination = "mydestinationQueue")
public void processMessage(String content) {
//do something
}
它工作得很好,但我需要能够以编程方式停止/暂停/启动这个bean ( REST调用或类似的调用)。
当我停止或暂停这个bean时,我希望确保已经完全处理了当前消息。
对此有什么想法吗?
谢谢
发布于 2015-10-19 20:40:09
这是我找到的解决方案
@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";
}
}
发布于 2015-09-16 00:06:43
有一个类型为JmsListenerEndpointRegistry
(名称为org.springframework.jms.config.internalJmsListenerEndpointRegistry
)的bean。
您可以从注册表(全部或按名称)访问JMS listener容器,并在所需的容器上调用stop()
;容器将在任何进程内消息完成处理后停止。
发布于 2018-10-10 16:17:03
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();
}
https://stackoverflow.com/questions/32588352
复制相似问题