正确关闭 ActiveMQ 和 Spring DefaultMessageListenerContainer

2024-01-07

当 Tomcat 管理器发出“停止”命令时,我们的系统不会关闭。我已确定与ActiveMQ/Spring有关。我什至已经弄清楚如何让它关闭,但是我的解决方案是一个黑客(至少我希望这不是“正确”的方法)。我想知道关闭 ActiveMQ 的正确方法,以便我可以删除我的 hack。

我继承了这个组件,但我不知道为什么要做出某些架构决策,经过大量挖掘后,我想我理解了他的想法,但我可能会遗漏一些东西。换句话说,真正的问题可能在于我们尝试使用 ActiveMQ/Spring 的方式。

我们在 ServletContainer (Tomcat 6/7) 中运行并使用 ActiveMQ 5.9.1 和 Spring 3.0.0 我们的应用程序的多个实例可以在一个“组”中运行,每个实例都在其自己的服务器上运行。 ActiveMQ 用于促进多个实例之间的通信。每个实例都有自己的嵌入式代理和自己的一组队列。每个实例上的每个队列都有 1 个 org.springframework.jms.listener.DefaultMessageListenerContainer 监听它,因此 5 个队列 = 5 个 DefaultMessageListenerContainer。

我们的系统正常关闭,直到我们通过向 ConnectionFactory 添加queuePrefetch =“0”来修复错误。起初我认为这个更改在某种程度上是不正确的,但现在我了解了情况,我确信我们不应该使用预取功能。

我创建了一个测试应用程序来复制该问题。请注意,下面的信息没有提及消息生产者。这是因为我可以复制该问题,而无需发送/处理一条消息。只需在启动期间创建 Broker、ConnectionFactory、Queues 和 Listeners,就足以防止系统正常停止。

这是我的 Spring XML 中的示例配置。如果有人需要,我很乐意提供我的整个项目:

<amq:broker persistent="false" id="mybroker"> 
 <amq:transportConnectors> 
  <amq:transportConnector uri="tcp://0.0.0.0:61616"/> 
 </amq:transportConnectors> 
</amq:broker> 

<amq:connectionFactory id="ConnectionFactory" brokerURL="vm://localhost?broker.persistent=false" > 
 <amq:prefetchPolicy> 
  <amq:prefetchPolicy queuePrefetch="0"/> 
 </amq:prefetchPolicy> 
</amq:connectionFactory> 

<amq:queue id="lookup.mdb.queue.cat" physicalName="DogQueue"/> 
<amq:queue id="lookup.mdb.queue.dog" physicalName="CatQueue"/> 
<amq:queue id="lookup.mdb.queue.fish" physicalName="FishQueue"/> 

<bean id="messageListener" class="org.springframework.jms.listener.DefaultMessageListenerContainer" abstract="true"> 
 <property name="connectionFactory" ref="ConnectionFactory"/> 
</bean> 

<bean parent="messageListener" id="cat"> 
 <property name="destination" ref="lookup.mdb.queue.dog"/> 
 <property name="messageListener"> 
  <bean class="com.acteksoft.common.remote.jms.WorkerMessageListener"/> 
 </property> 
 <property name="concurrentConsumers" value="200"/> 
 <property name="maxConcurrentConsumers" value="200"/> 
</bean> 

<bean parent="messageListener" id="dog"> 
 <property name="destination" ref="lookup.mdb.queue.cat"/> 
 <property name="messageListener"> 
  <bean class="com.acteksoft.common.remote.jms.WorkerMessageListener"/> 
 </property> 
 <property name="concurrentConsumers" value="200"/> 
 <property name="maxConcurrentConsumers" value="200"/> 
</bean> 

<bean parent="messageListener" id="fish"> 
 <property name="destination" ref="lookup.mdb.queue.fish"/> 
 <property name="messageListener"> 
  <bean class="com.acteksoft.common.remote.jms.WorkerMessageListener"/> 
 </property> 
 <property name="concurrentConsumers" value="200"/> 
 <property name="maxConcurrentConsumers" value="200"/> 
</bean> 

我的黑客涉及使用 ServletContextListener 手动停止对象。棘手的部分是我必须创建额外的线程来停止 DefaultMessageListenerContainers。也许我以错误的顺序停止了对象,但我已经尝试了我能想象到的一切。如果我尝试停止主线程中的对象,那么它们将无限期地挂起。

先感谢您!

UPDATE我根据身体的建议尝试了以下方法,但没有成功。我还尝试将 amq:transportConnector uri 指定为 tcp://0.0.0.0:61616?transport.daemon=true

  <amq:broker persistent="false" id="mybroker" brokerName="localhost">
   <amq:transportConnectors>
    <amq:transportConnector uri="tcp://0.0.0.0:61616?daemon=true"/>
   </amq:transportConnectors>
  </amq:broker>

  <amq:connectionFactory id="connectionFactory" brokerURL="vm://localhost" >
   <amq:prefetchPolicy>
    <amq:prefetchPolicy queuePrefetch="0"/>
   </amq:prefetchPolicy>
  </amq:connectionFactory>

有一次,我尝试向 amq:connectionFactory 元素中的brokerUrl 参数添加类似的属性,并且关闭工作正常,但是经过进一步测试,我了解到这些属性导致从 VMTransportFactory 抛出异常。这导致初始化不正确并且基本消息功能无法工作。


如果其他人想知道,据我所知,不可能有使用 ActiveMQ 的守护进程侦听器容器。

当 ActiveMQConnection 启动时,它会创建一个带有非守护线程的 ThreadPoolExecutor。这似乎是为了避免将连接从一个代理故障转移到另一个代理时出现问题。

https://issues.apache.org/jira/browse/AMQ-796 https://issues.apache.org/jira/browse/AMQ-796

executor = new ThreadPoolExecutor(1, 1, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadFactory() {
    @Override
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r, "ActiveMQ Connection Executor: " + transport);
        //Don't make these daemon threads - see https://issues.apache.org/jira/browse/AMQ-796
        //thread.setDaemon(true);
        return thread;
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正确关闭 ActiveMQ 和 Spring DefaultMessageListenerContainer 的相关文章

  • ActiveMQ Dead Letter Box.queue - 消息直接发送到那里?

    当使用 JMS 发布者 订阅者元素运行我的 JMeter 测试计划时 它似乎成功运行 并将跟踪数据发送到网页 我可以在JMeter中看到响应数据正常 然而 没有出现任何踪迹 因此 当查看 JMS 浏览器时 消息似乎直接进入 ActiveMQ
  • 在哪里可以手动配置 ActiveMQ 主机名? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我第一次尝试设置 Apache ActiveMQ 我发现我的服务器名称中有一个下划线 这导致 ActiveMQ 无法启动 它抛出这个异常
  • 我什么时候应该关闭在无状态会话 bean 中创建的 JMS 连接?

    我有一个关于何时关闭在无状态会话 Bean EJB 中创建的连接的一般性问题 连接到 ActiveMQ 并且它们是在 bean 的构造函数中创建的 然后在方法中使用该连接 我想知道关闭该连接的适当时间 地点是什么时候 有一个单独的方法来关闭
  • 在WSO2 ESB 4.7.0中,我们可以在接收序列中进行JMS回滚吗?

    我已经在 WSO2 ESB 4 7 0 中配置了带有事务和 CLIENT ACKNOWLEDGE 的 Apache ActiveMQ axis2 xml 配置是
  • Java Spring JMS:JmsTemplate 到 IBM MQ

    Update 这是我的错误 我忘记了 ssl 调试正在运行 它现在非常快并且像魔术一样工作 我有一个使用 Spring JMS 连接到 IBM MQ 的 Spring Boot 应用程序 我意识到与根本不使用 Spring 相比 jmsTe
  • ActiveMQ 中的只读 Web 控制台访问

    我正在使用 ActiveMQ 5 10 并且想创建一个通过 Web 控制台具有只读访问权限的用户 红帽发布本文 https access redhat com solutions 389323 提到由于 ActiveMQ 中的错误 它并不是
  • 如何使用 Spring WebSocket 向 STOMP 客户端发送错误消息?

    我正在使用 Spring 的 STOMP over WebSocket 实现和功能齐全的 ActiveMQ 代理 当用户SUBSCRIBE对于一个主题 有一些权限逻辑 必须经过一些权限逻辑 才能成功订阅 我正在使用 ChannelInter
  • Spring实际上是否使用REQUIRES_NEW启动一个新事务?

    我的 spring 4 1 1 应用程序部署在 JBoss 6 10 final 实例上 因此它使用基于容器的事务管理器和数据源 对于消息传递 我使用 TIBCO EMS 8 1 并设置了 XA 队列连接工厂 Java版本是1 8 0 20
  • ActiveMQ:如何使旧消息出队?

    我正在学习如何使用ActiveMQ 现在我们面临以下问题 假设我在 ActiveMQ 上有一个名为 topic test 的主题 它有两个订阅者 在特定时刻 我只有一个订阅者在等待消息 而生产者则为我上面提到的主题发送一条消息 好的 连接的
  • ActiveMQ 简单身份验证插件 - 用户管理员无权创建:topic://ActiveMQ.Advisory.Connection

    我修改了我们的 ActiveMQ 配置以使用 ActiveMQ 简单身份验证插件以及具有代理所有权限的单个用户和密码
  • 从 HTTP 端点发送消息到 JMS

    我正在尝试使用骆驼路由 它将接受 http 端点上的有效负载 然后将该有效负载写入 JMS 队列 到目前为止我所拥有的路线如下 但是一条空消息被传递到 jms 队列 消息到达那里 但没有正文 路线如下
  • 如何使用 NMS 和 C# 识别 ActiveMQ 断开连接

    我有一个 C 发布者和订阅者 它们使用 ActiveMQ 和 NMS 相互通信 一切工作正常 除了我无法知道 ActiveMQ 何时出现故障 这对于消费者来说尤其不利 他们停止获取数据 但除了数据停止显示之外 不会引发任何错误或事件 有没有
  • 如何使用 C 客户端通过 ActiveMQ 启用 SSL

    我已经配置了 ActiveMQ http activemq apache org http activemq apache org 通过以下方式使用 ssl 上下文RedHat 的 SSL TLS 教程 https access redha
  • 持久订阅 ActiveMQ

    我正在尝试为我的消息设置持久订阅者 以便即使在服务器重新启动后它们也能保留在主题中 但在配置过程中我收到与 xml 相关的错误 这是我的配置 xml
  • ActiveMQ - 向特定消费者发送消息

    连接单个 AMQ 代理和 100 个消费者 我会将消息发送给某个特定的消费者 这样其他消费者就不会收到它 客户端过滤不起作用 最简单的方法是创建虚拟目的地 将其命名为queue consumer 并在那里发送消息 然而 这将导致 100 个
  • ActiveMQ 的 @SendTo 注释无提示地失败

    我试图使用 SendTo 注释将 JMS 消息推送到 SpringBoot 应用程序中的独立 ActiveMQ 代理 但是执行完成时没有错误 异常 但消息未排队 相反 如果我使用 JmsTemplate 在代码中注释 消息将排队 使用 Se
  • ActiveMQ发送ObjectMessage

    我正在使用 ActiveMQ 在我当前的项目中实现消息系统 我需要发送和接收 Java 对象 而不是简单的文本或二进制消息 Java 对象 我的消息对象 根据需要实现了 Serialized 接口 ActiveMQ 的最新版本添加了一些安全
  • Java 1.4 上的 ActiveMQ 客户端

    我们在最新版本 5 6 0 中使用 Active MQ 现在我们遇到一个问题 必须连接一个新客户端 不幸的是这个客户端是用IBM JDK 1 4开发的 将 ActiveMQ 添加到应用程序会导致以下错误 UNEXPECTED ERROR O
  • Spring Service @Transactional 不回滚事务 Mybatis SqlSession

    目标是在失败时回滚所有 任何事务 但这并没有按预期工作 我们使用Spring MVC JMS Service Mybatis 在日志中 JMS 设置为回滚 但行已插入且未回滚 想知道我错过了什么或做错了什么吗 最近添加了 Transacti
  • 批量消费JMS消息

    The MessageListener接口只定义了一个方法onMessage接收单个Message作为论证 我正在寻找一种方法来获得多个Messages 从队列中 以便我可以处理该批次 然后确认所有Message批次中的 s JMS世界里有

随机推荐

  • 禁用单个(禁用)@Html.EditorFor 上的验证

    我读过 给定的执行方式似乎对于不同的操作 控制器具有不同的视图模型 在我看来 这有点矫枉过正 我想 Html EditorFor model gt model Ingredient Name new htmlAttributes new c
  • 如何将 Carbon AXUIElementRef 转换为 Cocoa NSWindow

    在我的项目中 我可以获得鼠标所在的窗口 并且我可以使用AXUIElementSetAttributeValue element kAXFrontmostAttribute kCFBooleanTrue 使窗口暂时处于顶层 所以我想将元素转换
  • 如何在 PrimeNG 15.4+ 中替换表头排序图标

    在最新版本的 PrimeNG 中 图标排序的方式发生了变化 他们曾经只是有一个i带有 CSS 类的标签 我可以在 CSS 中覆盖它以使用我公司的图标 但现在他们使用带有 SVG 的模板 我在他们的发行说明中看到如何覆盖菜单中的图标 例如下拉
  • git 提交目录

    我创建了一个存储库 并在本地将现有项目目录拖放到该存储库中 然后我做了类似 git add directory 的事情并提交并推送它 当我在 github 上查看我的存储库时 我看到的只是没有子文件夹 没有内容的目录 如何将该项目的所有文件
  • 如何将图库按钮添加到有意打开的相机中?

    在我的应用程序中 用户可以使用相机拍摄照片 我使用意图来启动它 Intent android provider MediaStore ACTION IMAGE CAPTURE 现在 当打开相机时 缺少图库按钮 该按钮允许用户从 SD 卡中选
  • 主导基线在 Firefox 中不起作用

    考虑以下示例 g transform translate 50px 50px dominant baseline central text anchor middle
  • 在 JavaScript 中分析 JSON 数据

    我并不是说这是一个完全聪明的想法 我认为 理想情况下 大量数据的计算应该在后端完成 但请幽默一下 我正在尝试从 JSON 源中提取视图数据并进行一些分析 给定以下数据源 group satellite 1 data label feed 1
  • 以编程方式更改标签属性

    问题是我需要以编程方式更改标签字体粗细和字体样式 但似乎没有任何效果 这是我到目前为止所尝试的 label FontWeight FontWeight FromOpenTypeWeight 99 对于 label FontStyle 我不知
  • 使用 Python 创建 2 人游戏

    我的朋友向我提出挑战 要求我制作一个我们可以互相对战的流行游戏 战舰 的版本 如果你不了解这款游戏 那其实并不重要 因为对我来说 困难的部分不是制作游戏 而是弄清楚我们如何通过计算机相互对战 我之前制作过同样的游戏 只针对一名玩家 我使用的
  • 如何在rails 4中的单个rails应用程序中访问多个数据库?

    我是 Rails 新手 不知道如何在 Rails 单个应用程序中访问多个数据库 我会这样尝试 配置 数据库 yml default default adapter mysql2 encoding utf8 pool 5 username r
  • R:按字母数字对数据框进行排序

    我有一个数据框 它存储每个模型的计数值 型号名称是字母数字 然后 我使用 ggplot2 生成条形图 其中 x 轴为模型 y 轴为计数 我想订购我的 x 轴 x 轴在数据框中和图中的 x 轴中显示如下 我想对其进行正确排序 例如 M 1 M
  • 如何强制将一段文本设置为“direction rtl”段落内的“direction ltr”

    因此 电话号码始终是ltr 从左到右 在多语言网站上工作时 我需要在具有方向 rtl 的文本段落中插入电话号码 带有 前缀和用 分隔的数字 当然对于相关语言 所以我有这样的事情 ltr test direction ltr rtl test
  • cout 和 printf 适用于内置调试而非发布的 Dll

    我构建了一个 DLL 通常通过 SetWindowHookEx 注入到控制台应用程序中 DLL 将信息输出到控制台非常重要 我一直在使用 std cout 执行此操作 DLL 已接近完成 直到我尝试在发布模式下构建 DLL 这使得所有 co
  • 调试 C 代码

    有人可以告诉我我的代码有什么问题以及为什么它会产生这个输出 Code int main unsigned num char response do printf Please enter a positive integer greater
  • 禁用属性的正确值是多少?

    的正确值是多少disabled文本框或文本区域的属性 我以前见过使用以下内容
  • 如何根据环境实现cucumber场景不同的数据

    我在不同环境中执行 cucumber jvm 场景时遇到问题 场景的特征文件中包含的数据属于一个环境 为了在不同的环境中执行场景 我需要根据要执行的环境更新功能文件中的数据 例如 在以下场景中 我将搜索条件包含在功能文件中 搜索条件对于 Q
  • Objective-C - 弱属性 - getter autoreleases(自动引用计数)

    我有疑问weakARC 中的属性 自动引用计数 我的理解 如有错误请指正 weak属性的行为类似于assign属性 但当该属性指向的实例被销毁时 ivar 会指向 nil 问题 我只是觉得吸气剂weak属性保留和自动释放 它不是应该像 ge
  • 动态添加的表行不会触发单击事件

    我有一个空表 我使用以下方法通过 jQuery 添加行 table gt tbody last append tr td symbol Code1 td td symbol Code2 td td symbol Code3 td tr 一切
  • 将基于类的组件转换为钩子(gapi API)

    我有这个基于类的组件 使用gapi Google Auth API来呈现按钮并且它可以工作 import React from react class GoogleAuth extends React Component state isS
  • 正确关闭 ActiveMQ 和 Spring DefaultMessageListenerContainer

    当 Tomcat 管理器发出 停止 命令时 我们的系统不会关闭 我已确定与ActiveMQ Spring有关 我什至已经弄清楚如何让它关闭 但是我的解决方案是一个黑客 至少我希望这不是 正确 的方法 我想知道关闭 ActiveMQ 的正确方