325.14. 使用基于 JDBC 的聚合存储库
可作为 Camel 2.6 使用。
INFO:在 Camel 2.6 中使用 JdbcAggregationRepository
在 Camel 2.6 中,JdbcAggregationRepository 在 camel-jdbc-aggregator
组件中提供。从 Camel 2.7 开始,JdbcAggregationRepository
在 camel-sql
组件中提供。
JdbcAggregationRepository
是一个 AggregationRepository
,它可即时保留聚合的消息。这可确保您不会松散的消息,因为默认聚合器将仅使用内存 AggregationRepository
。JdbcAggregationRepository
允许与 Camel 一起为聚合器提供持续支持。
只有当成功处理 Exchange 时,它才会标记为完成,当 确认
方法在 AggregationRepository
上调用时,才会将其标记为完成。这意味着,如果同一交换再次失败,它将被重试,直到成功为止。
您可以使用选项 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
325.14.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) );