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

时间:2017-03-13 15:57:50

标签: junit apache-camel activemq

我创建了一个集成测试(基于apache camel和blueprint),它将一些消息发送到我机器上的ActiveMQ服务。 通过admin-web界面,我可以检查我的消息是否到达。要从本地运行的ActiveMQ中解耦,我现在使用带有JUnit规则的EmbeddedActiveMQBroker(遵循here的说明):

@Rule
public EmbeddedActiveMQBroker broker = new EmbeddedActiveMQBroker() {
    @Override
    protected void configure() {
        try {
            this.getBrokerService().addConnector("tcp://localhost:61616");

        } catch (Exception e) {
            // noop test should fail
        }
    }
};

测试工作正常。 但是:有没有办法检查给定队列的(排队)messeage的数量?测试将消息发送到队列" q"。

1 个答案:

答案 0 :(得分:3)

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

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

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