如何使用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);
答案 0 :(得分:5)
这取决于提供程序,但在大多数情况下您不会知道,直到您创建会话类型,例如session.createConsumer。以这种方式创建消费者只会在您收到消息之前不会消费任何消息。在这里,行为可能会从提供商变为提供商和服务器配置。
例如,对于ActiveMQ,假设没有权限阻止您正在连接的用户,则在创建会话类型时会自动创建队列。
使用WebSphere MQ,队列必须由管理员定义。如果它不存在,队列管理器将返回原因代码为2085的异常(UNKNOWN_OBJECT_NAME)。
除此之外,您还需要查看特定提供商是否有办法访问队列列表。使用上面的示例,ActiveMQ可以使用JMX获取队列列表,使用WebSphere MQ,如果您有权将PCF命令发送到队列管理器,则可以执行此操作。
答案 1 :(得分:4)
尝试在传递刚创建的队列对象的Session中创建一个使用者或生产者:
session.createConsumer(queue);
如果队列(或主题)不存在,则应抛出InvalidDestinationException。