我正在开发一个以前使用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。
谢谢。
…据我所知,代码一直工作到最后的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
资源