[英]JMS ActiveMQ queue already exists
我有一個獨立的Java應用程序,它在spring config中使用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生產者連接到隊列的數據有關,這將使其變得唯一? 基於此唯一數據,是否可以確定“此”連接已經存在?
我已經確定,解決這些問題的最簡單方法是將獨立版本轉換為Web應用程序並在Tomcat下進行部署。 這樣,我將可以更輕松地管理應用程序的啟動/停止,並且可以確保在給定的時間僅運行該應用程序的一個實例。
我將繼續監控該問題,因此隨時發布您自己的解決方案,我將願意將接受的答案更改為您的答案!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.