Apache Camel和JMS集群(分布式队列)

时间:2017-12-09 09:33:47

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

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

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

enter image description here

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

Camel为分布式队列提供了什么样的支持?我们说我已经在Weblogic中配置了 JMS集群,并且想要在Camel中利用它。我需要什么样的特殊配置?请注意,在此示例中,我们使用两个不同的队列(或队列群集),因为无法在同一队列或服务器实例上调解Secret结果和Result消息,但仍必须保留所有消息之间的关联沿。

1 个答案:

答案 0 :(得分:0)

您是否尝试使用相关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和聚合路由进行呼叫,该路由将等待具有相同相关ID的2条消息,以便使用此信息进行工作。