gpt4 book ai didi

java - JMS ActiveMQ 队列已经存在

转载 作者:行者123 更新时间:2023-11-29 09:13:33 25 4
gpt4 key购买 nike

我有一个独立的 java 应用程序,它使用我的 spring 配置中的 spring-jms 标签启动多个 JMS 消费者:

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

bean 定义如下所示:

<bean id="fooConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${foo_broker_url}" />
</bean>

<jms:listener-container connection-factory="fooConnectionFactory" acknowledge="client" client-id="fooService">
<jms:listener destination="${foo_queue_name}" ref="fooListener" selector="${foo_selector}" />
</jms:listener-container>
...

我计划编写一个 Windows 批处理文件来启动消费者,并编写一个单独的批处理文件来关闭它(目前我一直在使用命令行启动它)。

我的问题有两个:
1. 关闭批处理文件实际上是如何关闭连接的?
2. 如果在队列已连接时执行启动批处理文件,我不希望应用程序创建第二个连接。有什么想法可以防止这种情况发生吗?

关于问题 2:我知道尝试将消息发送到队列并等待响应或失败可能会起作用,但这似乎有点矫枉过正,必须有更好的方法。我在 javax.jms.Connection 类的 API 文档中读到:

“如果调用此方法时另一个具有相同 clientID 的连接已在运行,则 JMS 提供程序应检测到重复的 ID 并抛出 InvalidClientIDException。”

但是,在监听器容器上指定一个 clientID(参见上面的 bean 定义)似乎并不能阻止第二次连接。

更新

我确定最简单的解决方案可能是在 Tomcat 下将此应用程序作为 Web 应用程序运行。然而,我将保留这个问题,希望有人能为所提出的任何一个问题提供可行的解决方案。

第一个问题可以改写/澄清如下:如何通过执行单独的应用程序/脚本来终止正在运行的应用程序/线程?

第二个问题可以通过提问来详细说明:是否存在与 JMS 生产者连接到队列相关的数据,使其唯一?基于这个独特的数据是否可以确定“这个”连接已经存在?

最佳答案

我确定处理这些问题的最简单方法是将我的独立应用程序转换为 Web 应用程序并部署在 Tomcat 下。通过这种方式,我将能够更轻松地管理应用程序的启动/停止,并且能够确保在给定时间只有一个应用程序实例在运行。

我会继续关注这个问题,所以请随时发布您自己的解决方案,我愿意将已接受的答案更改为您的答案!

关于java - JMS ActiveMQ 队列已经存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10962530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com