元資料儲存

許多外部系統、服務或資源不支援事務(例如 Twitter、RSS、檔案系統等),也無法將資料標記為已讀。此外,有時您可能需要在某些整合解決方案中實現企業整合模式(Enterprise Integration Pattern)中的冪等接收者(idempotent receiver)。為了實現這一目標,並在與外部系統進行下一次互動或處理下一條訊息之前儲存端點的一些先前狀態,Spring Integration 提供了元資料儲存元件,作為 org.springframework.integration.metadata.MetadataStore 介面的一個實現,遵循通用的鍵值約定。

元資料儲存旨在儲存各種通用元資料(例如,已處理的最後一條 feed 條目的釋出日期),以幫助 feed 介面卡等元件處理重複項。如果一個元件沒有直接提供 MetadataStore 的引用,查詢元資料儲存的演算法如下:首先,在應用上下文中查詢 ID 為 metadataStore 的 bean。如果找到,則使用它。否則,建立一個 SimpleMetadataStore 的新例項,這是一個記憶體實現,僅在當前執行的應用上下文生命週期內持久化元資料。這意味著在重啟後,您可能會遇到重複條目。

如果您需要在應用上下文重啟之間持久化元資料,框架提供了以下持久化 MetadataStores

PropertiesPersistingMetadataStore 由屬性檔案和一個 PropertiesPersister 提供支援。

預設情況下,它僅在應用上下文正常關閉時持久化狀態。它實現了 Flushable 介面,因此您可以透過呼叫 flush() 來隨時持久化狀態。以下示例展示瞭如何使用 XML 配置 'PropertiesPersistingMetadataStore'

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

或者,您可以提供自己的 MetadataStore 介面實現(例如 JdbcMetadataStore),並將其在應用上下文中配置為一個 bean。

從 4.0 版本開始,SimpleMetadataStorePropertiesPersistingMetadataStoreRedisMetadataStore 實現了 ConcurrentMetadataStore 介面。它們提供了原子更新功能,並且可以在多個元件或應用例項中共享使用。

冪等接收者與元資料儲存

當需要過濾已處理過的入站訊息並可以丟棄它或在丟棄時執行其他邏輯時,元資料儲存對於實現企業整合模式(EIP)的冪等接收者(idempotent receiver)模式非常有用。以下配置顯示了一個如何實現此目的的示例

<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