Как я могу остановить / запустить / приостановить @JmsListener (чистый способ)
Я использую Spring(boot) в своем проекте, и я получаю доступ к JMS Queue (ActiveMQ), используя:
@JmsListener(destination = "mydestinationQueue")
public void processMessage(String content) {
//do something
}
И это работает отлично, но мне нужно иметь возможность остановить / приостановить / запустить этот компонент программно (вызов REST или что-то в этом роде)
Когда я останавливаю или приостанавливаю этот компонент, я хочу быть уверенным, что полностью обработал текущее сообщение.
есть идеи по этому поводу?
Спасибо
3 ответа
Вот решение, которое я нашел
@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
).
Вы можете получить доступ к контейнерам приемника 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();
}