如何在启动时以编程方式禁用 Spring @JmsListener
Posted
技术标签:
【中文标题】如何在启动时以编程方式禁用 Spring @JmsListener【英文标题】:How to disable Spring @JmsListener programmatically on startup 【发布时间】:2015-12-18 18:18:07 【问题描述】:我有一个 Spring 应用程序,它的方法用 Spring 的 @JmsListener 注释。该应用程序部署在多个节点上。在某些特定节点上,我需要禁用 JMS 侦听器,以便它不会从队列中拉出消息。
似乎有一种方法可以在应用程序启动后停止侦听器。但这似乎在启动和禁用代码运行之间的短暂窗口处于打开状态,应用程序实例可能会消耗消息。那么有没有办法在应用程序启动期间禁用监听器。
【问题讨论】:
【参考方案1】:您需要自定义注解创建的监听器容器定义。
添加侦听器容器工厂@Bean
(参见the documentation)并将autoStartup
属性设置为false
。
setAutoStartup(false);
然后,您可以根据需要通过JmsListenerEndpointRegistry
bean 获取引用来启动每个容器。容器本身不是 bean - 从它的 javadoc...
...
* <p>Contrary to @link MessageListenerContainers 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.
...
【讨论】:
我看不到如何调用 DefaultMessageListenerContainer.setAutoStartup(false)。我正在使用 Java Config 并且有一个提供 DefaultJmsListenerContainerFactory 的 @Bean,如文档中所示。但是工厂没有 setAutoStartup 方法。 是的;它在超类AbstractJmsListenerContainerFactory
;创建容器时,它会传播到实际的侦听器容器。见createListenerContainer()
。
感谢您的确认。我看到这是在 Spring 4.2 中添加的,如此处所述jira.spring.io/browse/SPR-12824以上是关于如何在启动时以编程方式禁用 Spring @JmsListener的主要内容,如果未能解决你的问题,请参考以下文章
在启动时以编程方式为 5 个选项卡栏项目设置选项卡栏标题,其中 4 个嵌入在导航控制器中,1 个没有。目标 C
在 Spring Boot 应用程序中禁用 Spring JMS 自动配置