提问者:小点点

Activemq-Artemis管理消息对主题列表的请求没有响应


我正在开发一个以前使用OpenMQ作为JMS提供程序的java服务程序,但我正在将其转换为使用Activemq-artemis。

我需要从artemis获取现有主题/队列的列表。到目前为止,我有下面的代码,它是我根据artemis附带的示例以及我在网络上找到的其他一些代码示例开发的(离开try/catch out):

    TransportConfiguration tportConfig = new TransportConfiguration(NettyConnectorFactory.class.getName());
    QueueConnectionFactory qcf = (QueueConnectionFactory) ActiveMQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.QUEUE_CF, tportConfig);

    QueueConnection qConn = qcf.createQueueConnection();

    QueueSession session = qConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

    javax.jms.Queue managementQueue = ActiveMQJMSClient.createQueue("activemq.management");

    QueueRequestor requestor = new QueueRequestor(session, managementQueue);

    qConn.start();

    Message mgtMsg = session.createMessage();

    JMSManagementHelper.putAttribute(mgtMsg, org.apache.activemq.artemis.api.core.management.ResourceNames.JMS_SERVER, "topicNames");

    Message reply = requestor.request(mgtMsg);

跨过调试器中的每一行,代码就像我所知道的那样工作,直到最后的request. request()方法调用。调用它之后,线程似乎出现了黑洞。调试器没有进入下一行,catch块没有启动,artemis.log没有记录任何类型的错误。如果我在put属性调用中使用字符串queueNames,我会得到相同的结果。

我的代码是否有问题,或者有人可以让我了解可能发生的事情吗?

其他细节:artemis服务器2.1.0和客户端代码在单个开发机器JDK7u65上本地运行,在这个项目之外的测试代码我可以发布和使用一个简单的消息到/从artemis。

谢谢。


共1个答案

匿名用户

…据我所知,代码一直工作到最后的request. request()方法调用。调用它后,似乎线程黑洞。调试器没有进入下一行,catch块没有启动,artemis.log没有记录任何类型的错误。

当JMS请求者没有收到对其发送的请求的响应时,这听起来像是JMS请求者的正常行为。

artemis服务器2.1.0和客户端代码在单个开发机器上本地运行

您尝试使用的常量org.apache.activemq.artemis.api.core.management. ResourceNames.JMS_SERVER实际上并不存在于Artemis 2.1.0中。您的客户端必须使用1.x库,而不是您在此处描述的库,否则您将收到编译错误。

这可能是您问题的根源。换句话说,您正在尝试管理一个实际不存在的资源(即JMS服务器)。

也就是说,我希望代理记录一条关于无法找到资源的WARN消息。

我推荐:

  • 使用最新版本
  • 参考最新的管理示例
  • 使用addressNames作为org.apache.activemq.artemis.api.core.management.ResourceNames.BROKER资源
  • 的属性