此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

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

元数据存储旨在存储各种类型的通用元数据(例如,已处理的最后一个源条目的发布日期),以帮助源适配器等组件处理重复项。 如果组件没有直接提供对 的引用,则用于查找元数据存储的算法如下: 首先,在应用程序上下文中查找具有 ID 的 Bean。 如果找到,请使用它。 否则,请创建一个 的新实例,该实例是内存中实现,仅在当前正在运行的应用程序上下文的生命周期内保留元数据。 这意味着,重新启动后,您最终可能会得到重复的条目。MetadataStoremetadataStoreSimpleMetadataStoreSpring中文文档

如果需要在应用程序上下文重启之间持久化元数据,框架将提供以下持久性:MetadataStoresSpring中文文档

由属性文件和 PropertiesPersister 提供支持。PropertiesPersistingMetadataStoreSpring中文文档

默认情况下,它仅保留应用程序上下文正常关闭时的状态。 它实现,以便您可以通过调用 来随意保留状态。 下面的示例演示如何使用 XML 配置“PropertiesPersistingMetadataStore”:Flushableflush()Spring中文文档

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

或者,您可以提供自己的接口实现(例如,),并在应用程序上下文中将其配置为 Bean。MetadataStoreJdbcMetadataStoreSpring中文文档

从版本 4.0 开始,、 和 实现 。 它们提供原子更新,可以跨多个组件或应用程序实例使用。SimpleMetadataStorePropertiesPersistingMetadataStoreRedisMetadataStoreConcurrentMetadataStoreSpring中文文档

幂等接收方和元数据存储

元数据存储可用于实现 EIP 幂等接收器模式,当需要过滤传入消息(如果该消息已被处理)并且您可以丢弃它或在丢弃时执行一些其他逻辑时。 以下配置显示了如何执行此操作的示例:Spring中文文档

<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"/>

幂等条目的到期日期,在此日期之后,该条目应由某些预定的收割者从元数据存储中删除。valueSpring中文文档

MetadataStoreListener

某些元数据存储(目前只有 zookeeper)支持注册侦听器以在项更改时接收事件,如以下示例所示:Spring中文文档

public interface MetadataStoreListener {

	void onAdd(String key, String value);

	void onRemove(String key, String oldValue);

	void onUpdate(String key, String newValue);
}

有关更多信息,请参见 Javadoc。 如果您只对事件的子集感兴趣,则可以对其进行子类化。MetadataStoreListenerAdapterSpring中文文档