【问题标题】:Is it possible to get a list of queues on a remote broker?是否可以在远程代理上获取队列列表?
【发布时间】:2014-08-04 10:28:57
【问题描述】:

我正在尝试弄清楚如何获取远程代理上现有队列的列表。

看起来我可以通过添加咨询消息(我还没有工作)来监听队列的创建/销毁,但我需要在启动时获取所有现有队列。

看来我可以用 getDestinationMap 做到这一点:

http://activemq.apache.org/maven/apidocs/org/apache/activemq/broker/region/Region.html#getDestinationMap()

但这似乎只能从嵌入式和进程内代理调用。

我的意思是...我愿意走那条路,但似乎更有意义的是只为 activemq 设置正常的 init/daemon,然后像普通的 JMS 消费者一样让远程进程连接到它。

此文档似乎暗示这是可能的:

http://activemq.apache.org/how-can-i-see-what-destinations-are-used.html

但这是通过使用 Region 对象,并且只有在与 activemq 位于同一个 JVM 中时这似乎才有可能。

【问题讨论】:

    标签: java activemq


    【解决方案1】:

    看到这个答案:https://stackoverflow.com/a/14021722/3735747

    如果您在 Java 中执行此操作,DestinationSource 类会有所帮助:http://activemq.apache.org/maven/5.7.0/activemq-core/apidocs/org/apache/activemq/advisory/DestinationSource.html

    创建一个连接并使用 ActiveMQConnection 类型而不是 JMS Connection 类型。

    // Create a ConnectionFactory
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    
    // Create a Connection
    ActiveMQConnection connection = (ActiveMQConnection) connectionFactory.createConnection();
    

    连接后,您可以创建 DestinationSource 对象并获取队列:

    DestinationSource ds = connection.getDestinationSource();
    Set<ActiveMQQueue> queues = ds.getQueues();
    
    for(ActiveMQQueue queue : queues){
        try {
            System.out.println(queue.getQueueName());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
    

    【讨论】:

    • 哇.. 迷人。我在 5.9.1 并且没有那个方法......有 get Topic() 但没有 getQueues()
    • 其实.. 过失。在那里。我认为这只是一个 intellij 错误。
    • 好的..所以方法在那里..但是代码不起作用。这个粘贴箱(pastebin.com/BCjfSGyc)返回零队列......
    • 为此,您必须在客户端和经纪人上都启用咨询支持。
    • @TimBish 咨询功能默认启用,不是吗?
    【解决方案2】:
        // Create a ConnectionFactory
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    
    // Create a Connection
    ActiveMQConnection connection = (ActiveMQConnection) connectionFactory.createConnection();
    
    
    //Important point that was missed in the above answer
    connection.start();
    
    DestinationSource ds = connection.getDestinationSource();
    Set<ActiveMQQueue> queues = ds.getQueues();
    
    for(ActiveMQQueue queue : queues){
        try {
            System.out.println(queue.getQueueName());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
    

    【讨论】:

    • 这应该是答案,connection.start(); 是让它工作的关键
    • TL;DR :确保将 Connection 转换为 (ActiveMQConnection)
    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多