メタデータストア

多くの外部システム、サービス、リソースはトランザクションに対応しておらず(Twitter、RSS、ファイルシステムなど)、データを既読としてマークする機能がありません。また、一部の統合ソリューションでは、エンタープライズ統合パターンのべき等レシーバー (英語) を実装する必要がある場合もあります。この目的を達成し、外部システムとの次のやり取りの前にエンドポイントの以前の状態を保存したり、次のメッセージを処理したりするために、Spring Integration は、汎用的なキーバリュー契約を備えた org.springframework.integration.metadata.MetadataStore インターフェースの実装としてメタデータストアコンポーネントを提供します。

メタデータストアは、フィードアダプターなどのコンポーネントが重複を処理できるように、さまざまな種類の汎用メタデータ(処理された最後のフィードエントリの公開日など)を保存するように設計されています。コンポーネントに MetadataStore への参照が直接提供されていない場合、メタデータストアを見つけるアルゴリズムは次のとおりです。まず、アプリケーションコンテキストで metadataStore ID を持つ Bean を検索します。見つかった場合は、それを使用します。見つからない場合は、現在実行中のアプリケーションコンテキストのライフサイクル内でメタデータのみを保持するメモリ内実装である SimpleMetadataStore の新しいインスタンスを作成します。つまり、再起動するとエントリが重複する可能性があります。

アプリケーションコンテキストの再起動間でメタデータを保持する必要がある場合、フレームワークは次の永続的な MetadataStores を提供します。

Spring Cloud AWS (英語) には DynamoDbMetadataStore も備わっています。

PropertiesPersistingMetadataStore は、プロパティファイルと PropertiesPersister (Javadoc) によってサポートされています。

デフォルトでは、アプリケーションコンテキストが正常に閉じられたときの状態のみを永続化します。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 をサブクラス化できます。