Как я могу остановить / запустить / приостановить @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();
    }
Другие вопросы по тегам