Metadata Store

許多外部系統、服務或資源不是交易式的(Twitter、RSS、檔案系統等等),而且沒有任何能力將資料標記為已讀取。此外,有時您可能需要在某些整合解決方案中實作企業整合模式 等冪接收器。為了達成此目標,並在下次與外部系統互動之前儲存端點的先前狀態,或處理下一個訊息,Spring Integration 提供了中繼資料儲存元件,作為 org.springframework.integration.metadata.MetadataStore 介面的實作,具有通用的鍵值契約。

中繼資料儲存旨在儲存各種類型的通用中繼資料(例如,已處理的最後一個 Feed 條目的發佈日期),以協助 Feed 介面卡等元件處理重複項目。如果未直接向元件提供 MetadataStore 的參考,則定位中繼資料儲存的演算法如下:首先,在應用程式上下文中尋找具有 metadataStore ID 的 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 等冪接收器 模式非常有用。以下配置示範了如何執行此操作的範例

<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 進行子類別化。