问题
I am using Spring(boot) on my project and I access a JMS Queue (ActiveMQ) using :
@JmsListener(destination = "mydestinationQueue")
public void processMessage(String content) {
//do something
}
And it works perfectly but I need to be able to stop/pause/start this bean programatically (a REST call or something like that)
When I stop or pause this bean I want to be sure to have fully processed the current message.
any idea about that ?
thanks
回答1:
Here is the solution I've found
@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:
There's a bean of type JmsListenerEndpointRegistry
(name org.springframework.jms.config.internalJmsListenerEndpointRegistry
).
You can access the JMS listener containers from the registry (all or by name) and call stop()
on the one(s) you want; the container will stop after any in-process messages complete their processing.
回答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();
}
来源:https://stackoverflow.com/questions/32588352/how-can-i-stop-start-pause-a-jmslistener-the-clean-way