【问题标题】:When source and replyTo is the same, stop Camel from consuming after route stopped当 source 和 replyTo 相同时,在 route 停止后停止 Camel 消费
【发布时间】:2023-01-17 19:40:21
【问题描述】:

我们的系统配置为使用和发送回复到同一个队列,即JMSDestinationJMSReplyTo是相同的。我现在无法更改。

在我的集成测试中,如果我设置replyToSameDestinationAllowed=true,Camel 将继续使用我发送到队列的回复,即它“捕获”源并且永不停止并进入循环。

但是,如果我不设置它,Camel 会拒绝将回复发送到队列,并表示:

JMSDestination 和 JMSReplyTo 相同,将跳过向自身发送回复消息

这导致我的集成测试出现问题。我想在一个单独的方法中使用消息并对它进行断言。

我怎样才能阻止 Camel 捕获这个队列,即只消耗一次而忽略其余的?

在路线的尽头,我拨打stop() 自动发送回复。

当收到第二条消息(回复)时,我看到这一行:

2023-01-10 14:37:22,186 DEBUG [org.apa.cam.com.jms.EndpointMessageListener]-{Camel (camel-1) thread #19 - JmsConsumer[my.queue]}-收到的消息有 JMSCorrelationID [ID :hostname-1673354133272-4:1:1:10:1]

我可以用它来忽略回复吗?我应该停止路线吗?回滚?或者我该怎么办?

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:

    最后,我根据 JMSCorrelationID 标头的存在过滤掉了消息。

    from("activemq:xxx")
        .filter(simple("${header.JMSCorrelationID} == null")) // ignore reply
        .to("direct:main");
    

    即使我没有在我的客户端代码中设置它,如果传入消息没有,Camel 似乎也会在发送回复时使用消息 ID 来设置 JMSCorrelationID。如果传入消息已经有 JMSCorrelationID,Camel 不会更改它,并将该值复制到回复中。(我猜如果您在客户端手动设置 JMSCorrelationID,Camel 将停止为您设置)。

    所以基本上,没有 JMSCorrelationID 的消息意味着它是尚未通过我的客户端应用程序的新消息。我认为只有客户端应该设置它,特别是在我的情况下,原始消息和回复被放入同一个队列,客户端需要一种方法来过滤掉回复。

    另外,我发现接收可以指定一个消息收集器,说明您要过滤的字段。例如:

        QueueReceiver receiver = jmsSession.createReceiver(myQueue, "JMSCorrelationID='" + correlationId + "'");
    

    当您知道 correlationId 时,这很有用。但在我的情况下(@QuarkusIntegrationTest 是黑盒测试),这不能使用。


    但是这样做之后,在我的集成测试中,Camel 仍然“捕获”了消息,并且不会让另一种方法正确地使用消息(另一种方法从不接收任何东西);所以最后我禁用了测试。似乎在过滤掉消息后,Camel 的行为与我调用.stop() 时完全相同,执行回调(发送回复);并将原始消息发送到回复队列,在我的例子中,是原始队列,所以它在循环,永远不会放手。即使我启用重复检查,它仍然会捕获。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2017-09-23
      • 2018-06-10
      • 2017-07-31
      • 2012-05-08
      • 2022-01-18
      相关资源
      最近更新 更多