簡體   English   中英

JMS ActiveMQ隊列已存在

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM