Metadata Store
許多外部系統、服務或資源不是交易式的(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
進行子類別化。