java - Apache Camel - 将消息路由到 JPA 端点 - 保持订单但根据类别 header 分成池

标签 java jpa connection-pooling apache-camel database-concurrency

我们有一个简单的项目,它从多个端点(代理)获取大量消息。这些代理都输出相同格式的消息(要放置在数据库中的实体对象)。所有代理都写入同一个队列,我们​​使用它们并通过 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/

相关文章:

java - 将 Java 连接到 SQL Anywhere 数据库时出错

java - 将 List<T> 中的平均值作为单个 T 对象返回

database - 为什么一个包含许多打开的连接的连接池对于系统来说比每次打开一个新连接的成本要低?

java - hibernate c3p0 ThreadPoolExecutor 连接池,我做对了吗?

java - 与 JPA 的自连接关系

java - 应用程序中不同模块的多连接池配置

java - 将终端输出输入java

java - 我如何将操作绑定(bind)到代号中的对话框 "OK"按钮

hibernate - 我可以为 @Entity 定义默认顺序吗?

java - Hibernate OneToOne 之间具有惰性行为的 PK