元数据存储库
许多外部系统、服务或资源不是事务性的(如 Twitter 、 RSS 、文件系统等),并且没有任何能力将数据标记为已读。此外,有时您可能需要在某些集成解决方案中实现企业集成模式 幂等接收者。为了实现这一目标,并在与外部系统进行下一次交互之前存储端点的一些先前状态或处理下一条消息,Spring Integration 提供了元数据存储组件,作为 org.springframework.integration.metadata.MetadataStore
接口的实现,具有通用的键值约定。
元数据存储设计用于存储各种类型的通用元数据(例如,已处理的最后一条 feed 条目的发布日期),以帮助诸如 feed 适配器之类的组件处理重复项。如果组件没有直接提供 MetadataStore
的引用,则查找元数据存储的算法如下:首先,在应用程序上下文中查找带有 metadataStore
ID 的 bean。如果找到了,就使用它。否则,创建一个新的 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
。