【发布时间】:2012-06-13 07:41:51
【问题描述】:
我有一个独立的 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 生产者连接到队列相关的数据,这将使它成为唯一的?根据这个独特的数据,是否可以确定“这个”连接已经存在?
【问题讨论】: