如何在启动时以编程方式禁用 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的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring 启动和停止 JMS 侦听器

在启动时以编程方式为 5 个选项卡栏项目设置选项卡栏标题,其中 4 个嵌入在导航控制器中,1 个没有。目标 C

在 Spring Boot 应用程序中禁用 Spring JMS 自动配置

深入浅出JMS--Spring和ActiveMQ整合的完整实例

使用 AjaxForm 时以编程方式提交表单

如何在显示旋转时以编程方式更改布局约束