323.11. 使用基于 JDBC 的聚合存储库

可作为 Camel 2.6 使用。

注意

Using JdbcAggregationRepository in Camel 2.6

在 Camel 2.6 中,JdbcAggregationRepository 在 camel-jdbc-aggregator 组件中提供。从 Camel 2.7 开始,JdbcAggregationRepositorycamel-sql 组件中提供。

JdbcAggregationRepository 是一个 AggregationRepository,它可即时保留聚合的消息。这可确保您不会丢失消息,因为默认聚合器仅使用内存 聚合库中JdbcAggregationRepository 允许与 Camel 一起为聚合器提供持续支持。

只有当成功处理 Exchange 时,它才会标记为完成,当 确认 方法在 AggregationRepository 上调用时,才会将其标记为完成。这意味着,如果同一 Exchange 再次失败,它会被重试,直到成功为止。

您可以使用选项 maximumRedeliveries 来限制给定恢复的 Exchange 的最大重新传送尝试次数。您还必须设置 deadLetterUri 选项,因此 Camel 知道在点击 的最大值时要发送交换 的位置。

您可以在 camel-sql 单元测试中看到一些示例,例如: https://svn.apache.org/repos/asf/camel/trunk/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregateRecoverDeadLetterChannelTest.java

323.11.1. 数据库

要正常运行,每个聚合器使用两个表:聚合和完成一个。按照惯例,已完成的聚合的名称与带有 "_COMPLETED" 后缀的聚合名称相同。名称必须在 Spring bean 中通过 RepositoryName 属性进行配置。在以下示例中,将使用下列聚合。

两个表的表结构定义都相同:如果一个 String 值用作键(id),而 Blob 包含字节数组中的交换序列化。
但应该记住有一个区别: id 字段没有相同的内容,具体取决于表。
在聚合表 id 中,包含组件用于聚合消息的关联 ID。在完成的表中,id 包含相应 blob 字段中存储的交换的 id。

以下是用于创建表的 SQL 查询,只需将 "aggregation" 替换为您的聚合器存储库名称。

CREATE TABLE aggregation ( id varchar(255) NOT NULL, exchange blob NOT
NULL, constraint aggregation_pk PRIMARY KEY (id) ); CREATE TABLE
aggregation_completed ( id varchar(255) NOT NULL, exchange blob NOT
NULL, constraint aggregation_completed_pk PRIMARY KEY (id) );