在不创建新队列的情况下读取AMQ队列消息

时间:2019-03-28 16:35:11

标签: jms activemq

我正在尝试使用以下代码从ActiveMQ队列浏览消息。如果不存在,这将在代理上创建一个新的destinationQueue。如何避免创建新队列?我期望如果给定的队列不存在,则JMSException

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");       
Connection connection = connectionFactory.createConnection("admin", "admin");
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue(destinationQueue);
QueueBrowser queueBrowser = session.createBrowser(queue);
Enumeration enumMsgs = queueBrowser.getEnumeration();

2 个答案:

答案 0 :(得分:1)

有关此主题,请参见ActiveMQ documentation

  

How do I create new destinations中所述,无需预先创建所有目的地,您可以让经纪人即时创建它们。

     

但是,如果您不希望这种行为,或者希望将此行为限制为某些主题或队列Wildcards(队列或主题名称空间的区域),则可以使用Security插件不允许在队列和主题名称空间的任何区域使用 admin 角色

答案 1 :(得分:0)

它是一个实时系统,很遗憾,我无法访问其安全设置或其他用户。但是找到了解决方法, 在创建“ QueueBrowser”之前,我通过以下代码获取了队列集合,并使用该集合验证了“ destinationQueue” [提供浏览的队列名称]

        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        ActiveMQConnection connection = (ActiveMQConnection)connectionFactory.createConnection("admin","admin");
        connection.start();
        DestinationSource ds = connection.getDestinationSource();
        Set<ActiveMQQueue> queues = ds.getQueues();
        for (ActiveMQQueue queue : queues) {
            if (destinationQueue.equals(queue.getPhysicalName())) {
                queueExists = true;
            }

        }