我们有一个简单的项目,它从多个端点(代理)获取大量消息。这些代理都输出相同格式的消息(要放置在数据库中的实体对象)。所有代理都写入同一个队列,我们使用它们并通过 JPA 将它们发送到数据库。
所以本质上系统有一组生产者将消息写入一个队列。队列是单线程的,只接收消息并将其转储到数据库中。
这里的问题是这种方法很慢。 Camel 中是否有任何功能(例如重新排序)可以用来根据消息的来源拆分这些消息。因此,虽然来自 Agent1 的消息需要按照创建的顺序进行持久化,但来自 Agent2 的消息是独立的,因此它们不应该按照 Agent1 的消息顺序等待。对于两个代理来说,这是一个简单的问题,因为我们只需创建两个队列,每个代理一个。我们有许多代理,因此我们需要一个可扩展的解决方案。
是否有任何模式可以在 Camel 中本地完成此操作?我们可以编写自己的保留队列,该队列与代理名称同步,并且只将一条消息放入多线程 JPA 写入队列,但这将是一种迂回的方式,因为我们需要设置从队列到 jpa Camel 路由的回调,或者我们不会使用 Camel ,而只是通过我们自己的管理器来完成(并不是说这会很复杂,但如果我们可以使用 Camel 或其他东西来完成这一切,那就太好了可以这么说,不必重新发明轮子)。
最佳答案
如果您的源是 JMS 消息队列,那么请查看消息组
关于此的 Apache ActiveMQ 文档在这里: http://activemq.apache.org/message-groups.html
还有这个常见问题解答 http://activemq.apache.org/how-do-i-preserve-order-of-messages.html
基本上,您可以使用 JMSXGroupID JMS 属性来标记代理 ID,例如 agent1、agent2 等。
然后您就可以在 JMS 消息队列上拥有并发消费者,这些消费者可以基于 JMSXGroupID 并行运行。但仍保留每个组内的顺序。这意味着您可以并行写入 JPA agent1、agent2、...agentN。
关于java - Apache Camel - 将消息路由到 JPA 端点 - 保持订单但根据类别 header 分成池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7788982/