JDBC Metadata Store
版本 5.0 引入了 JDBC MetadataStore(参见元数据存储)实现。你可以使用 JdbcMetadataStore 来维护应用程序重启之间的元数据状态。此 MetadataStore 实现可与以下适配器一起使用:
要将这些适配器配置为使用 JdbcMetadataStore,请通过使用 metadataStore 的 bean 名称来声明一个 Spring bean。Feed 入站通道适配器和 feed 入站通道适配器都会自动获取并使用已声明的 JdbcMetadataStore,如下例所示:
@Bean
public MetadataStore metadataStore(DataSource dataSource) {
return new JdbcMetadataStore(dataSource);
}
org.springframework.integration.jdbc 包包含多个关系型数据库管理系统(RDBMS)供应商的数据库模式脚本。例如,以下清单展示了元数据表的 H2 DDL:
CREATE TABLE INT_METADATA_STORE (
METADATA_KEY VARCHAR(255) NOT NULL,
METADATA_VALUE VARCHAR(4000),
REGION VARCHAR(100) NOT NULL,
constraint INT_METADATA_STORE_PK primary key (METADATA_KEY, REGION)
);
您可以将 INT_ 前缀更改为符合目标数据库设计要求的前缀。您也可以配置 JdbcMetadataStore 以使用自定义前缀。
JdbcMetadataStore 实现了 ConcurrentMetadataStore 接口,使其能够在多个应用程序实例之间可靠地共享,其中只有一个实例能够存储或修改某个键的值。得益于事务保证,所有这些操作都是原子性的。
事务管理必须使用 JdbcMetadataStore。入站通道适配器可以在轮询器配置中引用 TransactionManager。与非事务性的 MetadataStore 实现不同,使用 JdbcMetadataStore 时,条目仅在事务提交后才会出现在目标表中。当发生回滚时,不会有任何条目被添加到 INT_METADATA_STORE 表中。
自 5.0.7 版本起,您可以为基于锁的元数据存储条目查询配置 JdbcMetadataStore,使用特定于 RDBMS 供应商的 lockHint 选项。默认情况下,该选项为 FOR UPDATE;如果目标数据库不支持行锁定功能,可以将其配置为空字符串。请咨询您的供应商,了解在更新前锁定行的 SELECT 表达式中可用的特定且可能的提示。