Java JMS ActiveMQ队列已存在

Java JMS ActiveMQ队列已存在,java,spring,activemq,Java,Spring,Activemq,我有一个独立的java应用程序,它使用我的spring配置中的spring JMS标记激发几个JMS消费者: ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 下面是bean定义的样子: <bean id="fooConnectionFactory" class="org.apache.activemq.ActiveMQConnect

我有一个独立的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并抛出InvalidClientIndexception

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

更新 我已经确定,最简单的解决方案可能是在Tomcat下以webapp的形式运行此应用程序。不过,我将保留这个问题,希望有人能为提出的任何一个问题提供可行的解决办法

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

第二个问题可以通过以下问题来阐述:
是否有一段与JMS生产者连接到队列相关的数据会使其唯一?基于这些独特的数据,是否可以确定“此”连接已经存在?

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


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

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

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