2014-10-08 45 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命令发送到队列管理器,则可以执行此操作。