如何在启动时以编程方式禁用 Spring @JmsListener
How to disable Spring @JmsListener programmatically on startup
我有一个 Spring 应用程序,它的方法用 Spring 的 @JmsListener 注释。该应用程序部署在多个节点上。在某些特定节点上,我需要禁用 JMS 侦听器,以便它不会从队列中拉出消息。
似乎有一种方法可以在应用程序启动后停止侦听器。但这似乎在启动和禁用代码运行之间留下了短暂的window,应用程序实例可能会使用消息。所以有没有办法在应用程序启动期间禁用侦听器。
您需要自定义注释创建的侦听器容器定义。
添加侦听器容器工厂@Bean
(参见the documentation)并将autoStartup
属性设置为false
。
setAutoStartup(false);
然后您可以根据需要通过 JmsListenerEndpointRegistry
bean 获取引用来启动每个容器。容器本身不是 beans - 来自它的 javadoc...
...
* <p>Contrary to {@link MessageListenerContainer}s created manually, listener
* containers managed by registry are not beans in the application context and
* are not candidates for autowiring. Use {@link #getListenerContainers()} if
* you need to access this registry's listener containers for management purposes.
* If you need to access to a specific message listener container, use
* {@link #getListenerContainer(String)} with the id of the endpoint.
...
我有一个 Spring 应用程序,它的方法用 Spring 的 @JmsListener 注释。该应用程序部署在多个节点上。在某些特定节点上,我需要禁用 JMS 侦听器,以便它不会从队列中拉出消息。
似乎有一种方法可以在应用程序启动后停止侦听器。但这似乎在启动和禁用代码运行之间留下了短暂的window,应用程序实例可能会使用消息。所以有没有办法在应用程序启动期间禁用侦听器。
您需要自定义注释创建的侦听器容器定义。
添加侦听器容器工厂@Bean
(参见the documentation)并将autoStartup
属性设置为false
。
setAutoStartup(false);
然后您可以根据需要通过 JmsListenerEndpointRegistry
bean 获取引用来启动每个容器。容器本身不是 beans - 来自它的 javadoc...
...
* <p>Contrary to {@link MessageListenerContainer}s created manually, listener
* containers managed by registry are not beans in the application context and
* are not candidates for autowiring. Use {@link #getListenerContainers()} if
* you need to access this registry's listener containers for management purposes.
* If you need to access to a specific message listener container, use
* {@link #getListenerContainer(String)} with the id of the endpoint.
...