1

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

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

    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);

遍历调试器中的每一行,代码一直有效,直到最后的 requestor.request() 方法调用。调用此之后,似乎是线程黑洞。调试器没有进入下一行,catch 块没有启动,artemis.log 没有记录任何类型的错误。如果我在 putAttribute 调用中使用字符串 queueNames,我会得到相同的结果。

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

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

谢谢。

4

1 回答 1

2

...在最后的 requestor.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 消息。

我建议:

于 2018-01-11T20:40:33.310 回答