2014-10-08 46 views
6

如何檢查使用Java API的JMS服務器上是否存在隊列?我現在不想向隊列發送或接收任何數據,只需確認隊列是否存在即可。此外,隊列可能爲空。如何使用Java驗證是否存在JMS隊列?

這是我的代碼示例。爲了簡單起見,我已經刪除了錯誤處理。

Connection connection = null; 
    Session session = null; 
    connection = factory.createConnection(); 
    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

    //I was hoping this next line would throw an exception if the queue does not exist 
    Queue queue = session.createQueue(queueName); 

我的JMS服務器是TIBCO EMS。我希望能夠在5-7版本上運行的解決方案。

解決方案

我也跟着在接受答案的建議,但創造了一個瀏覽器。下面的代碼行拋出異常的期望:

QueueBrowser browser = session.createBrowser(queue); 
+0

JMS沒有定義管理接口或模型;因此對此的回答取決於您的JMS提供者。你在使用哪一個? – Calanais 2014-10-08 15:46:49

回答

3

嘗試創建一個消費者或生產者關閉會話傳入隊列對象剛創建:

session.createConsumer(queue); 

這應該拋出InvalidDestinationException如果隊列(或主題)不存在。

4

這取決於提供者,但在創建會話類型(如session.createConsumer)之前,大多數情況下都不知道。以這種方式簡單地創建一個消費者,不會消耗任何消息,直到您收到消息。在這裏,行爲可能會從提供者到服務器的提供者和配置發生變化。

例如對於ActiveMQ,假設沒有權限阻止您連接的用戶,創建會話類型時會自動創建隊列。

對於WebSphere MQ,隊列必須由管理員定義。如果它不存在,則隊列管理器將返回原因碼爲2085的異常(UNKNOWN_OBJECT_NAME)。

除此之外,您需要查看特定提供者是否有訪問隊列列表的方法。使用上面的例子,A​​ctiveMQ可以使用JMX和WebSphere MQ獲得隊列列表,如果您有權將PCF命令發送到隊列管理器,則可以執行此操作。