66.15. 使用基于 JDBC 的聚合存储库
JdbcAggregationRepository
是一个 聚合Repository
,可立即保留聚合的消息。这样可确保不会丢失消息,因为默认聚合器将仅在内存中使用 AggregationRepository
。JdbcAggregationRepository
允许与 Camel 一起为聚合器提供持久支持。
只有成功处理 Exchange 时,它才会被标记为 complete,当 确认方法在
聚合
时被调用时会出现这种情况。这意味着,如果同一交换再次失败,它将会一直被重试,直到成功为止。
您可以使用选项 maximumRedeliveries
来限制给定恢复交换的最大重新发送尝试次数。您还必须设置 deadLetterUri
选项,以便 Camel 知道当 maximumRedeliveries
为 hit 时发送 Exchange 的位置。
您可以查看 camel-sql 单元测试中的一些示例,如 JdbcAggregateRecoverDeadLetterChannelTest.java
66.15.1. 数据库
要正常工作,每个聚合器都使用两个表:聚合并完成。按照惯例,完成的名称与聚合的名称相同,后缀为 "_COMPLETED
"。名称必须使用 RepositoryName
属性在 Spring bean 中配置。在以下示例中,将使用聚合。
两个表的表结构定义相同:在这两种情况下,字符串值都用作键(id),而 Blob 包含字节数组中的交换序列化。
但是,应该记住一个区别: id 字段没有与表相同的内容。
在聚合表 id 中,包含组件用来聚合消息的关联 Id。在完成的表中,id 包含存储在相应 blob 字段中的交换的 id。
以下是用于创建表的 SQL 查询,只需将 "聚合"
替换为您的聚合器存储库名称。
CREATE TABLE aggregation ( id varchar(255) NOT NULL, exchange blob NOT NULL, version BIGINT NOT NULL, constraint aggregation_pk PRIMARY KEY (id) ); CREATE TABLE aggregation_completed ( id varchar(255) NOT NULL, exchange blob NOT NULL, version BIGINT NOT NULL, constraint aggregation_completed_pk PRIMARY KEY (id) );