跳到主要内容
版本:7.0.2

Metadata Store

DeepSeek V3 中英对照 Metadata Store

许多外部系统、服务或资源不具备事务性(如Twitter、RSS、文件系统等),且无法将数据标记为已读。此外,在某些集成解决方案中,您可能需要实现企业集成模式中的幂等接收器。为实现这一目标,并在与外部系统进行下一次交互之前存储端点的先前状态,或处理下一条消息,Spring Integration 提供了元数据存储组件,该组件实现了 org.springframework.integration.metadata.MetadataStore 接口,并遵循通用的键值约定。

元数据存储旨在存储各种类型的通用元数据(例如,已处理的最后一条订阅源条目的发布日期),以帮助订阅源适配器等组件处理重复项。如果某个组件未直接获得对 MetadataStore 的引用,则查找元数据存储的算法如下:首先,在应用程序上下文中查找 ID 为 metadataStore 的 Bean。如果找到,则使用它。否则,创建一个新的 SimpleMetadataStore 实例,这是一个内存实现,仅在当前运行的应用程序上下文的生命周期内持久化元数据。这意味着,重启后可能会出现重复条目。

若需在应用上下文重启之间持久化元数据,框架提供了以下持久化 MetadataStores

Spring Cloud AWS 同样提供了 DynamoDbMetadataStore

PropertiesPersistingMetadataStore 由一个属性文件和一个 PropertiesPersister 支持。

默认情况下,仅在应用程序上下文正常关闭时持久化状态。它实现了 Flushable 接口,因此您可以通过调用 flush() 方法随时持久化状态。以下示例展示了如何使用 XML 配置 'PropertiesPersistingMetadataStore':

<bean id="metadataStore"
class="org.springframework.integration.metadata.PropertiesPersistingMetadataStore"/>

或者,你也可以提供自己的 MetadataStore 接口实现(例如 JdbcMetadataStore),并将其配置为应用上下文中的一个 bean。

从 4.0 版本开始,SimpleMetadataStorePropertiesPersistingMetadataStoreRedisMetadataStore 实现了 ConcurrentMetadataStore。它们支持原子更新,并可在多个组件或应用程序实例间使用。

幂等接收器与元数据存储

元数据存储可用于实现 EIP 幂等接收器 模式,当需要过滤已处理过的传入消息时,您可以丢弃该消息或在丢弃时执行其他逻辑。以下配置展示了如何实现此功能的示例:

<int:filter input-channel="serviceChannel"
output-channel="idempotentServiceChannel"
discard-channel="discardChannel"
expression="@metadataStore.get(headers.businessKey) == null"/>

<int:publish-subscribe-channel id="idempotentServiceChannel"/>

<int:outbound-channel-adapter channel="idempotentServiceChannel"
expression="@metadataStore.put(headers.businessKey, '')"/>

<int:service-activator input-channel="idempotentServiceChannel" ref="service"/>

幂等条目的 value 可以是一个过期日期,在此日期之后,该条目应由某个预定的清理程序从元数据存储中移除。

MetadataStoreListener

某些元数据存储(目前仅支持 ZooKeeper)支持注册监听器以在项目变更时接收事件,如下例所示:

public interface MetadataStoreListener {

void onAdd(String key, String value);

void onRemove(String key, String oldValue);

void onUpdate(String key, String newValue);
}

更多信息请参阅 Javadoc。若您仅关注部分事件,可继承 MetadataStoreListenerAdapter 类进行扩展。