Spring Boot通过JmsListenerEndpointRegistry停止JMS消费者报错咨询
问题原因
你代码中调用context.getBean("consumer", JmsListenerEndpointRegistry.class)时,Spring容器中名为consumer的Bean是你自定义的com.example.demo.Consumer类实例,并非JmsListenerEndpointRegistry类型,因此抛出类型不匹配的BeanNotOfRequiredTypeException异常。
JmsListenerEndpointRegistry是Spring JMS模块的核心组件,在你添加@EnableJms注解时,Spring会自动将该类型的Bean注册到容器中,无需自己创建。
正确实现方案
方案1:全局控制所有JMS消费者启停
直接注入JmsListenerEndpointRegistry实例,调用其stop()/start()方法即可控制所有JMS监听器的启停,修正后的JmsController代码如下:
@RestController @RequestMapping("/jms") public class JmsController { @Autowired private JmsListenerEndpointRegistry jmsListenerEndpointRegistry; @GetMapping(value = "/halt") public String haltJmsListener() { jmsListenerEndpointRegistry.stop(); return "Jms Listener Stopped"; } @GetMapping(value = "/start") public String startJmsListener() { jmsListenerEndpointRegistry.start(); return "Jms Listener Started"; } }
方案2:精准控制单个JMS消费者启停
如果需要只启停指定的消费者,先给对应@JmsListener注解添加id属性标识监听器:
@Component public class Consumer { // 为当前监听器指定唯一id @JmsListener(destination = "simple-jms-queue", id = "simpleQueueListener") public void listener(String msg) { System.out.println("Received Message : " + msg); } }
再通过注册中心获取指定id的监听器容器单独控制:
@GetMapping(value = "/halt-simple") public String haltSimpleJmsListener() { MessageListenerContainer container = jmsListenerEndpointRegistry.getListenerContainer("simpleQueueListener"); if (container != null && container.isRunning()) { container.stop(); } return "指定JMS监听器已停止"; } @GetMapping(value = "/start-simple") public String startSimpleJmsListener() { MessageListenerContainer container = jmsListenerEndpointRegistry.getListenerContainer("simpleQueueListener"); if (container != null && !container.isRunning()) { container.start(); } return "指定JMS监听器已启动"; }
补充说明
监听器停止后不会再消费队列中的新消息,重启后会自动消费停止期间积压的消息,符合常规的消费者启停需求。
内容的提问来源于stack exchange,提问作者Nital
相关产品推荐
相关产品推荐

