如何使用Java验证JMS队列是否存在?

时间:2014-10-08 15:09:32

标签: java jms

如何使用Java API检查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);

2 个答案:

答案 0 :(得分:5)

这取决于提供程序,但在大多数情况下您不会知道,直到您创建会话类型,例如session.createConsumer。以这种方式创建消费者只会在您收到消息之前不会消费任何消息。在这里,行为可能会从提供商变为提供商和服务器配置。

例如,对于ActiveMQ,假设没有权限阻止您正在连接的用户,则在创建会话类型时会自动创建队列。

使用WebSphere MQ,队列必须由管理员定义。如果它不存在,队列管理器将返回原因代码为2085的异常(UNKNOWN_OBJECT_NAME)。

除此之外,您还需要查看特定提供商是否有办法访问队列列表。使用上面的示例,ActiveMQ可以使用JMX获取队列列表,使用WebSphere MQ,如果您有权将PCF命令发送到队列管理器,则可以执行此操作。

答案 1 :(得分:4)

尝试在传递刚创建的队列对象的Session中创建一个使用者或生产者:

session.createConsumer(queue);

如果队列(或主题)不存在,则应抛出InvalidDestinationException。