当前位置: 首页 > 知识库问答 >
问题:

ActiveMQ骆驼路由的JUnit测试用例

龚鸿羽
2023-03-14

我在MyRouteBuilder中有一条骆驼路线。正在使用ActiveMQ消息的java文件:

from("activemq:queue:myQueue" )
.process(consumeDroppedMessage)
.log(">>> I am here");

我写了一个测试用例如下:

@Override
public RouteBuilder createRouteBuilder() throws Exception {
    return new MyRouteBuilder();
}

@Test
void testMyTest() throws Exception {
    String queueInputMessage = "My Msg";
    template.sendBody("activemq:queue:myQueue", queueInputMessage);
    assertMockEndpointsSatisfied();

}

当我运行单元测试用例时,我得到了这个奇怪的错误:

7:53:26.175 [main] DEBUG org.apache.camel.impl.engine.InternalRouteStartupManager - Route: route1 >>> Route[activemq://queue:null -> null]
17:53:26.175 [main] DEBUG org.apache.camel.impl.engine.InternalRouteStartupManager - Starting consumer (order: 1000) on route: route1
17:53:26.175 [main] DEBUG org.apache.camel.support.DefaultConsumer - Build consumer: Consumer[activemq://queue:null]
17:53:26.185 [main] DEBUG org.apache.camel.support.DefaultConsumer - Init consumer: Consumer[activemq://queue:null]
17:53:26.185 [main] DEBUG org.apache.camel.support.DefaultConsumer - Starting consumer: Consumer[activemq://queue:null]
17:53:26.213 [main] DEBUG org.apache.activemq.thread.TaskRunnerFactory - Initialized TaskRunnerFactory[ActiveMQ Task] using ExecutorService: java.util.concurrent.ThreadPoolExecutor@3fffff43[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
17:53:26.215 [main] DEBUG org.apache.activemq.transport.failover.FailoverTransport - Reconnect was triggered but transport is not started yet. Wait for start to connect the transport.
17:53:26.334 [main] DEBUG org.apache.activemq.transport.failover.FailoverTransport - Started unconnected
17:53:26.334 [main] DEBUG org.apache.activemq.transport.failover.FailoverTransport - Waking up reconnect task
17:53:26.335 [ActiveMQ Task-1] DEBUG org.apache.activemq.transport.failover.FailoverTransport - urlList connectionList:[tcp://localhost:61616], from: [tcp://localhost:61616]
17:53:26.339 [main] DEBUG org.apache.camel.component.jms.DefaultJmsMessageListenerContainer - Established shared JMS Connection
17:53:26.340 [main] DEBUG org.apache.camel.component.jms.DefaultJmsMessageListenerContainer - Resumed paused task: org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker@58c34bb3
17:53:26.372 [ActiveMQ Task-1] DEBUG org.apache.activemq.transport.failover.FailoverTransport - Attempting 0th connect to: tcp://localhost:61616
17:53:28.393 [ActiveMQ Task-1] DEBUG org.apache.activemq.transport.failover.FailoverTransport - Connect fail to: tcp://localhost:61616, reason: {}

看到这些信息,我尤其感到困惑:

Route: route1 >>> Route[activemq://queue:null -> null]

urlList connectionList:[tcp://localhost:61616], from: [tcp://localhost:61616]

虽然我有一个正确的队列名称,但为什么队列显示为null?还有,为什么代理urltcp://localhost:61616

我想运行这个单元测试用例,以便它在所有环境中正常运行,如:本地、DIT、SIT、PROD等。因此,我不能负担的经纪人url是:tcp://localhost:61616

关于我在这里做错了什么,我应该做什么,有什么想法吗?

编辑1:
我看到的问题之一甚至是在调用测试类之前,调用了MyRouteBuilder()内部的createRouteBuilder(),导致了我在日志中看到的问题。

共有2个答案

蓝苗宣
2023-03-14

我没有设置显式活动mq代理,而是开始使用VM代理。

@Override
    protected RoutesBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() {
                ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
                ActiveMQComponent activeMQComponent = new ActiveMQComponent();
                activeMQComponent.setConnectionFactory(connectionFactory);
                context.addComponent("activemq", activeMQComponent);
                from("activemq:queue:myQueue").to("mock:collector");
            }
        };
    }

另外,我把骆驼jUnit误认为是传统的jUnit。我们不需要显式调用实际的路由生成器类。相反,在上面设置了我的activeMq组件后,我能够编写我的测试方法,模拟队列的endpoint,发送消息并断言它们。骆驼是真正的多才多艺。虽然需要大量的学习。

裴金鑫
2023-03-14

“activemq:队列:…”告诉Camel在幕后使用自动配置魔法(使用默认url),而您的用例就不止这些了。

您需要配置一个连接工厂(ActiveMQConnectionFactory)并配置一个camel jms组件来使用该连接工厂。

连接工厂允许您指定url、userName、密码、默认连接设置和设置SSL。

最好的做法是将url、userName、密码和队列外部化到属性文件中,这样您就可以在本地、DIT、SIT和prod等环境中更改这些内容。

注意:使用org.apache.camel/camel-jms组件,而不是org.apache.activemq/activemq-camel组件。

 类似资料:
  • 问题内容: 我尝试对Apache骆驼路线进行junit测试。像这样的东西: 构建器类的定义如下 “ myExportRouteProcessor”类仅从JPA存储库中获取一些数据,并将结果放入路由。我想要的是在测试类中触发此路由,以检查整个过程是否正确完成。当前,处理器未启动。我该怎么办? 问题答案: 您可以使用AdviceWithRouteBuilder#replaceFromWith直接替换测

  • 我试着为阿帕奇骆驼路线做一个jUnit测试。类似于这样: builder类的定义如下 myExportRouteProcencer类只是从JPA存储库中获取一些数据,并将结果放入路由。我想要的是在测试类中触发此路由,以检查整个过程是否正确完成。目前,处理器没有被触发。我应该做些什么?

  • 我有一个Springboot应用程序,其中配置了一些驼峰路线。 我想测试从到的路由。我试过这里提到的不同东西http://camel.apache.org/camel-test.html,但似乎无法让它工作。 我正在尝试这样做: 但是我的ProducerTemplate总是。我尝试了自动连接CamelContext,但遇到一个异常,它无法解析CamelContext。但这可以通过添加到类。但是我的

  • 我正在将CSV文件输入集成到一个更大的系统中,我想对其进行设置,以便将CSV中未正确解析的各行(由)发送到医院队列,并将所有其他工作行转换为一个对象并聚合到一个列表中。但是,我很难将

  • 我正在研究spring MVC,并使用Apache camel来集成外部服务。我想使用Apache Camel route进行Webservice调用。 就像我的本地REST服务(http://localhostsmiliex.xx:8080/users)从外部REST服务获取数据(http://xxx:000/users)并希望通过路由获取外部数据。 哪个Apache组件适合Jetty或prod

  • 我正在使用死信频道EIP与骆驼文件中描述的死信频道完全相同。这是我的camel.xml(删除头) 我只有一条路由具有基于内容的路由器,其实质是,如果消息体具有getInfo,则从jms:foo路由到jms:getInfo,如果消息体具有performAction,则从jms.foo路由到jms:performAction 我预计,当jms:getInfo使用者没有运行时,交付将失败,重新交付尝试将