326.13. 使用基于 JDBC 的幂等存储库
从 Camel 2.7 开始提供 :在本节中,我们将使用基于 JDBC 的幂等存储库。
TIP:*Abstract class* From Camel 2.9 之后,有一个抽象类 org.apache.camel.processor.idempotent.jdbc.AbstractJdbcMessageIdRepository
,您可以扩展到构建自定义 JDBC 幂等存储库。
首先,我们必须创建将由幂等存储库使用的数据库表。对于 Camel 2.7,我们使用以下模式:
CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255), messageId VARCHAR(100) )
在 Camel 2.8 中,我们添加了 createdAt 列:
CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255), messageId VARCHAR(100), createdAt TIMESTAMP )
警告:SQL Server TIMESTAMP 类型是一个固定长度的二进制字符串类型。它没有映射到任何 JDBC 时间类型: DATE、TIME 或 TIMESTAMP。
自定义 JdbcMessageIdRepository
从 Camel 2.9.1 开始,您有几个选项可根据您的需要调整 org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository
:
参数 | 默认值 | 描述 |
---|---|---|
createTableIfNotExists | true | 定义 Camel 是否应该尝试创建表(如果不存在)。 |
tableExistsString | SELECT 1 FROM CAMEL_MESSAGEPROCESSED WHERE 1 = 0 | 此查询用于找出表是否已存在。必须抛出异常以指示表不存在。 |
createString | CREATE TABLE CAMEL_MESSAGEPROCESSED (processorName VARCHAR (255), messageId VARCHAR (100), createdAt TIMESTAMP) | 用于创建表的 语句。 |
queryString | SELECT COUNT(*) FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ?AND messageId = ? |
用于找出消息是否已存在于存储库中的查询(结果不等于 '0')。它采用两个参数。第一个是处理器名称( |
insertString | INSERT INTO CAMEL_MESSAGEPROCESSED (processorName, messageId, createdAt) VALUES (?, ?, ?) |
用于将该条目添加到表中的语句。它取三个参数。第一个是处理器名称( |
deleteString | DELETE FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ?AND messageId = ? |
用于从数据库中删除条目的语句。它取两个参数。第一个是处理器名称( |