如何使用带有EmbeddedActiveMQBroker的JUnit规则在单元测试中检查ActiveMQ队列

如何使用带有EmbeddedActiveMQBroker的JUnit规则在单元测试中检查ActiveMQ队列,junit,apache-camel,activemq,Junit,Apache Camel,Activemq,我创建了一个基于ApacheCamel和blueprint的集成测试,它将一些消息发送到我机器上的ActiveMQ服务。 通过管理员网络界面,我可以检查我的消息是否到达。要与本地运行的ActiveMQ解耦,我现在使用EmbeddedActiveMQBroker with JUnit规则,请遵循以下说明: 测试和以前一样正常。 但是:有没有办法检查给定队列的QueuedMessages数?测试将消息发送到队列q。您的EmbeddedActiveMQBroker实例围绕着一个ActiveMQ Bro

我创建了一个基于ApacheCamel和blueprint的集成测试,它将一些消息发送到我机器上的ActiveMQ服务。 通过管理员网络界面,我可以检查我的消息是否到达。要与本地运行的ActiveMQ解耦,我现在使用EmbeddedActiveMQBroker with JUnit规则,请遵循以下说明:

测试和以前一样正常。
但是:有没有办法检查给定队列的QueuedMessages数?测试将消息发送到队列q。

您的EmbeddedActiveMQBroker实例围绕着一个ActiveMQ BrokerService对象,该对象是真正的嵌入式ActiveMQ代理。因为您可以通过EmbeddedActiveMQBroker实例访问它,所以您可以通过AdminView broker.getBrokerService.getAdminView访问代理维护的所有统计信息

从那里您可以获得各种有用的信息,如订阅数量、队列数量等。所有这些数据都保存在代理的JMX管理上下文树中,因此标准JMX适用。获取队列中消息数量信息的一种简单方法是使用类似于以下代码的代码在代理的管理上下文中查找队列:

// For this example the broker name is assumed to be "localhost"
protected QueueViewMBean getProxyToQueue(String name) throws MalformedObjectNameException, JMSException {
    ObjectName queueViewMBeanName = new ObjectName("org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName="+name);
    QueueViewMBean proxy = (QueueViewMBean) brokerService.getManagementContext()
            .newProxyInstance(queueViewMBeanName, QueueViewMBean.class, true);
    return proxy;
}
从那里,您可以使用QueueViewMBean查看队列中的内容:

QueueViewMBean queueView = getProxyToQueue("myQueue");
LOG.info("Number of messages in my Queue:{}", queueView.getQueueSize());
看起来当前的实现在默认情况下禁用了JMX,这很不幸,但可以解决。您必须为嵌入式代理实例提供一个配置URI,该URI可以是包含要添加的连接器的字符串,也可以是xbean配置文件

一种选择是按照以下思路进行操作注意useJmx=true:

@Rule
public EmbeddedActiveMQBroker broker = new EmbeddedActiveMQBroker("broker:(tcp://0.0.0.0:0)/localhost?useJmx=true&persistent=false");

EmbeddedActiveMQBroker实例围绕一个ActiveMQ BrokerService对象,该对象是真正的嵌入式ActiveMQ代理。因为您可以通过EmbeddedActiveMQBroker实例访问它,所以您可以通过AdminView broker.getBrokerService.getAdminView访问代理维护的所有统计信息

从那里您可以获得各种有用的信息,如订阅数量、队列数量等。所有这些数据都保存在代理的JMX管理上下文树中,因此标准JMX适用。获取队列中消息数量信息的一种简单方法是使用类似于以下代码的代码在代理的管理上下文中查找队列:

// For this example the broker name is assumed to be "localhost"
protected QueueViewMBean getProxyToQueue(String name) throws MalformedObjectNameException, JMSException {
    ObjectName queueViewMBeanName = new ObjectName("org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName="+name);
    QueueViewMBean proxy = (QueueViewMBean) brokerService.getManagementContext()
            .newProxyInstance(queueViewMBeanName, QueueViewMBean.class, true);
    return proxy;
}
从那里,您可以使用QueueViewMBean查看队列中的内容:

QueueViewMBean queueView = getProxyToQueue("myQueue");
LOG.info("Number of messages in my Queue:{}", queueView.getQueueSize());
看起来当前的实现在默认情况下禁用了JMX,这很不幸,但可以解决。您必须为嵌入式代理实例提供一个配置URI,该URI可以是包含要添加的连接器的字符串,也可以是xbean配置文件

一种选择是按照以下思路进行操作注意useJmx=true:

@Rule
public EmbeddedActiveMQBroker broker = new EmbeddedActiveMQBroker("broker:(tcp://0.0.0.0:0)/localhost?useJmx=true&persistent=false");

感谢您的代码,但它似乎不起作用:该方法返回所需类型的对象,但在调用getQueueSize时,我得到一个InstanceNotFoundException。您可能需要确保已启用嵌入式代理上的管理上下文。如何执行此操作?我还尝试用jconsole查找MBean,但似乎没有关于activemaq的内容,而我看到了所有其他MBean。添加了一些更多信息。JUnit嵌入位似乎做了错误的事情,默认情况下关闭了JMX。如何在jUnit5中使用它?没有更多@Rule。感谢您的代码,但它似乎不起作用:该方法返回所需类型的对象,但在调用getQueueSize时,我得到一个InstanceNotFoundException。您可能需要确保已启用嵌入式代理上的管理上下文。如何执行此操作?我还尝试用jconsole查找MBean,但似乎没有关于activemaq的内容,而我看到了所有其他MBean。添加了一些更多信息。JUnit嵌入位似乎做了错误的事情,默认情况下关闭了JMX。如何在jUnit5中使用它?再也没有@规则了。