【问题标题】:Apache Camel and JMS cluster (distributed queues)Apache Camel 和 JMS 集群(分布式队列)
【发布时间】:2017-12-16 00:45:30
【问题描述】:

如何在分布式消息队列中使用 Camel?基本上我有三个服务的系统,其中 A 是 SOAP 客户端的同步边界。 A 调用服务 C,但从服务 B 获取结果集。运行每个服务的多个实例以保证高可用性。

我必须使用异步消息传递(消息队列),因为请求的结果必须来自与调用不同的服务(C 无法获得 B 的结果集,A 也无法获得 C 的结果集,因此服务不能同步链接)。最大的挑战是将响应消息路由到正确的实例/线程(A 是 同步 服务,它在获得结果之前一直处于阻塞状态)。经过研究,我发现 JMS 为此提供了两种方法:JMSCorrelationIDJMSReplyTo 标头。 Camel 似乎可以透明地处理这些标头。

但还有更大的挑战。当然,我还必须运行消息队列的多个实例来保证高可用性。如果任何消息队列出现故障,系统仍然可用。

Camel 为分布式队列提供了哪些开箱即用的支持? 假设我在 Weblogic 中配置了 JMS 集群,并希望利用它在骆驼。我需要什么样的特殊配置?请注意,在此示例中,我们使用了两个不同的队列(或队列集群),因为 Secret result 和 Result 消息不能在同一个队列或服务器实例上进行冥想,但仍然必须始终保持消息之间的相关性。

【问题讨论】:

  • 您需要满足一些极其复杂的要求。我不确定 Camel 是否是您在这里需要的,因为这听起来应该是一个应用程序而不是一个集成。但是,如果你坚持使用 Camel,我想你可以使用 recipientList 根据运行时的一些计算来设置接收 JMS 队列(我猜是代理)。

标签: jakarta-ee apache-camel jms microservices messaging


【解决方案1】:

您是否尝试过使用相关 ID?

类似这样的:

from("direct:myCall")
.setProperty("myCorrelationId", constant("1"))
.setBody(constant("MESSAGE"))
.to("socket-tcp://SOCKET:16010")
.toD("direct:aggregator")
.end();

from("direct:aggregator")
.aggregate(property("myCorrelationId"),(oldExchange, newExchange) -> {
    if(oldExchange != null) {
        /*do somenthing*/
    }
    if(newExchange != null) {
        /*Do something*/
    }
    return newExchange;
}).eagerCheckCompletion().completionSize(2)
.to("log:foo")
.end();

在此示例中,您将使用关联 ID 和聚合路由进行调用,该路由将等待 2 条具有相同关联 ID 的消息使用此信息进行工作。

【讨论】:

    猜你喜欢
    • 2018-01-14
    • 1970-01-01
    • 2015-11-01
    • 2011-08-23
    • 1970-01-01
    • 2017-06-16
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多