JMS ActiveMQ队列已存在

时间:2012-06-09 16:12:31

标签: java spring activemq

我有一个独立的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下的webapp运行。但是,我希望有人能够为所提出的任何一个问题提供可行的解决方案。

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

第二个问题可以通过询问来详细说明: 是否存在与JMS生成器连接相关的数据,这些数据会使其成为唯一的?基于这个独特的数据,可以确定“这个”连接已经存在吗?

1 个答案:

答案 0 :(得分:0)

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

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