You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Boot中用JmsListenerEndpointRegistry条件启停@JmsListener?

如何单独启停Spring Boot中的指定@JmsListener

要实现单独控制每个@JmsListener的启停,你可以借助JmsListenerEndpointRegistry来管理各个监听容器,具体步骤如下:

1. 为每个@JmsListener指定唯一ID

先修改你的监听类,给每个@JmsListener注解添加id属性,这样能精准定位到对应的监听容器:

@Component
public class MyJmsListener{
    @Autowired
    private MyService myService;

    @JmsListener(id = "listener-one", destination="${queue.nameOne}")
    void receiveMessageOne(Message message){
        myService.process(message);
    }

    @JmsListener(id = "listener-two", destination="${queue.nameTwo}")
    void receiveMessageTwo(Message message){
        myService.process(message);
    }

    @JmsListener(id = "listener-three", destination="${queue.nameThree}")
    void receiveMessageThree(Message message){
        myService.process(message);
    }
}

2. 注入JmsListenerEndpointRegistry并编写启停逻辑

创建一个管理类(或直接在监听类中)注入JmsListenerEndpointRegistry,通过ID获取对应的MessageListenerContainer,调用其start()/stop()方法控制启停:

@Component
public class JmsListenerManager {
    @Autowired
    private JmsListenerEndpointRegistry registry;

    // 停止指定ID的监听
    public void stopListener(String listenerId) {
        MessageListenerContainer container = registry.getListenerContainer(listenerId);
        if (container != null && container.isRunning()) {
            container.stop();
        }
    }

    // 启动指定ID的监听
    public void startListener(String listenerId) {
        MessageListenerContainer container = registry.getListenerContainer(listenerId);
        if (container != null && !container.isRunning()) {
            container.start();
        }
    }

    // 示例:根据配置条件初始化时调整监听状态
    @PostConstruct
    public void initListenerState() {
        // 替换为你的条件判断逻辑,比如读取配置属性
        boolean disableListenerOne = Boolean.parseBoolean(System.getProperty("listener.one.disable", "false"));
        if (disableListenerOne) {
            stopListener("listener-one");
        }
    }
}

3. 运行时动态控制(可选)

如果需要在运行时触发启停操作,可以编写一个Controller暴露接口:

@RestController
@RequestMapping("/jms/listener")
public class JmsListenerController {
    @Autowired
    private JmsListenerManager manager;

    @PostMapping("/stop/{id}")
    public String stop(@PathVariable String id) {
        manager.stopListener(id);
        return "Listener " + id + " stopped";
    }

    @PostMapping("/start/{id}")
    public String start(@PathVariable String id) {
        manager.startListener(id);
        return "Listener " + id + " started";
    }
}

注意事项

  • 每个@JmsListener的id必须唯一,否则会导致容器无法被正确识别或覆盖。
  • 调用stop()后,容器会停止接收新消息,但正在处理的消息会继续执行(可通过stopTimeout配置强制终止超时的任务)。
  • 若需在启动时就控制监听状态,除了@PostConstruct,还可以结合@ConditionalOnProperty等条件注解实现更灵活的配置。

内容的提问来源于stack exchange,提问作者geeta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 15:07:18