此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Integration 6.5.1! |
元数据存储
许多外部系统、服务或资源(Twitter、RSS、文件系统等)不是事务性的,并且无法将数据标记为已读。
此外,有时,您可能需要在某些集成解决方案中实现企业集成模式幂等接收器。
为了实现此目标并在下次与外部系统交互之前存储端点的一些先前状态或处理下一条消息,Spring Integration 提供了元数据存储组件作为org.springframework.integration.metadata.MetadataStore
与通用键值合约的接口。
元数据存储旨在存储各种类型的通用元数据(例如,已处理的最后一个源条目的发布日期),以帮助源适配器等组件处理重复项。
如果组件没有直接提供对MetadataStore
,定位元数据存储的算法如下:首先,寻找一个带有metadataStore
应用程序上下文中的 ID。
如果找到,请使用它。
否则,请创建一个SimpleMetadataStore
,这是一种内存中实现,仅在当前正在运行的应用程序上下文的生命周期内保留元数据。
这意味着,在重新启动时,您最终可能会收到重复的条目。
如果需要在应用程序上下文重启之间保留元数据,则框架会提供以下持久性MetadataStores
:
-
PropertiesPersistingMetadataStore
这PropertiesPersistingMetadataStore
由属性文件和PropertiesPersister
.
默认情况下,它仅在应用程序上下文正常关闭时保留状态。
它实现Flushable
这样您就可以通过调用flush()
.
以下示例演示如何使用 XML 配置“PropertiesPersistingMetadataStore”:
<bean id="metadataStore"
class="org.springframework.integration.metadata.PropertiesPersistingMetadataStore"/>
或者,您可以提供自己的MetadataStore
接口(例如JdbcMetadataStore
),并将其配置为应用程序上下文中的 bean。
从 4.0 版本开始,SimpleMetadataStore
,PropertiesPersistingMetadataStore
和RedisMetadataStore
实现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
如果您只对事件的子集感兴趣,则可以进行子类化。