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

use*_*069 9 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);
Run Code Online (Sandbox Code Playgroud)

我的JMS服务器是TIBCO EMS.我希望有一个适用于5-7版本的解决方案.

解

我按照接受的答案中的建议,但创建了一个浏览器.以下行根据需要引发了异常:

QueueBrowser browser = session.createBrowser(queue);
Run Code Online (Sandbox Code Playgroud)

Eri*_*ams 5

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

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

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

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


小智 4

尝试在 Session 之外创建一个消费者或生产者,并传入您刚刚创建的队列对象:

session.createConsumer(queue);
Run Code Online (Sandbox Code Playgroud)

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