チャンネルアダプター

チャネルアダプターは、単一の送信者または受信者をメッセージチャネルに接続できるようにするメッセージエンドポイントです。Spring Integration は、JMS、ファイル、HTTP、Web サービス、メールなどのさまざまなトランスポートをサポートするためのアダプターを多数提供します。このリファレンスガイドの今後の章では、各アダプターについて説明します。ただし、この章では、シンプルだが柔軟なメソッド呼び出しチャネルアダプターのサポートに焦点を当てています。受信と送信の両方のアダプターがあり、それぞれがコア名前空間で提供される XML 要素で構成できます。これらは、ソースまたは宛先として呼び出すことができるメソッドがある限り、Spring Integration を継承する簡単な方法を提供します。

受信チャネルアダプターの構成

inbound-channel-adapter 要素は、Spring で管理されたオブジェクトの任意のメソッドを呼び出し、メソッドの出力を Message に変換した後、非 null の戻り値を MessageChannel に送信できます。アダプターのサブスクリプションがアクティブになると、ポーラーはソースからメッセージを受信しようとします。ポーラーは、提供された構成に従って TaskScheduler でスケジュールされます。個々のチャネルアダプターのポーリング間隔または cron 式を構成するには、'poller' 要素に 'fixed-rate' や 'cron' などのスケジューリング属性のいずれかを指定できます。次の例では、2 つの inbound-channel-adapter インスタンスを定義しています。

<int:inbound-channel-adapter ref="source1" method="method1" channel="channel1">
    <int:poller fixed-rate="5000"/>
</int:inbound-channel-adapter>

<int:inbound-channel-adapter ref="source2" method="method2" channel="channel2">
    <int:poller cron="30 * 9-17 * * MON-FRI"/>
</int:channel-adapter>
ポーラーが提供されない場合、単一のデフォルトポーラーをコンテキスト内に登録する必要があります。詳細については、エンドポイント名前空間のサポートを参照してください。
重要: ポーラー構成

一部の inbound-channel-adapter 型は SourcePollingChannelAdapter によってサポートされます。これは、ポーラーで指定された構成に基づいて、MessageSource をポーリングする(Message ペイロードになる値を生成するカスタムメソッドを呼び出す)ポーラー構成を含むことを意味します。次の例は、2 つのポーラーの構成を示しています。

<int:poller max-messages-per-poll="1" fixed-rate="1000"/>

<int:poller max-messages-per-poll="10" fixed-rate="1000"/>

最初の構成では、ポーリングタスクはポーリングごとに 1 回呼び出され、各タスク(ポーリング)中に、max-messages-per-poll 属性値に基づいてメソッド(メッセージの生成につながる)が 1 回呼び出されます。2 番目の構成では、ポーリングタスクはポーリングごとに 10 回、または "null" が返されるまで呼び出されるため、各ポーリングが 1 秒間隔で発生する間にポーリングごとに 10 個のメッセージが生成される可能性があります。ただし、構成が次の例のようになった場合はどうなりますか。

<int:poller fixed-rate="1000"/>

max-messages-per-poll が指定されていないことに注意してください。後で説明するように、PollingConsumer の同一のポーラー構成(サービスアクティベーター、フィルター、ルーターなど)の max-messages-per-poll のデフォルト値は -1 になります。つまり、「ポーリングメソッドは null を返し(おそらく QueueChannel にメッセージがないため)、その後 1 秒間スリープします。

ただし、SourcePollingChannelAdapter では、少し異なります。max-messages-per-poll のデフォルト値は、明示的に負の値(-1 など)に設定しない限り、1 です。これにより、ポーラーはライフサイクルイベント(開始や停止など)に対応できるようになり、MessageSource のカスタムメソッドの実装が null を返さない可能性があり、偶然に発生しない場合、無限ループで潜在的にスピンすることを防ぎます。割り込み可能。

ただし、メソッドが null を返すことが確実であり、各ポーリングで使用可能なソースの数だけポーリングする必要がある場合は、次の例に示すように、max-messages-per-poll を明示的に負の値に設定する必要があります。

<int:poller max-messages-per-poll="-1" fixed-rate="1000"/>

送信チャネルアダプターの構成

outbound-channel-adapter 要素は、MessageChannel を、そのチャネルに送信されたメッセージのペイロードで呼び出す必要がある POJO コンシューマーメソッドに接続することもできます。次の例は、送信チャネルアダプターを定義する方法を示しています。

<int:outbound-channel-adapter channel="channel1" ref="target" method="handle"/>

<beans:bean id="target" class="org.MyPojo"/>

適応されるチャネルが PollableChannel である場合、次の例に示すように、ポーラーサブ要素を提供する必要があります。

<int:outbound-channel-adapter channel="channel2" ref="target" method="handle">
    <int:poller fixed-rate="3000" />
</int:outbound-channel-adapter>

<beans:bean id="target" class="org.MyPojo"/>

POJO コンシューマー実装を他の <outbound-channel-adapter> 定義で再利用できる場合は、ref 属性を使用する必要があります。ただし、コンシューマー実装が <outbound-channel-adapter> の単一の定義によってのみ参照される場合、次の例に示すように、それを内部 Bean として定義できます。

<int:outbound-channel-adapter channel="channel" method="handle">
    <beans:bean class="org.Foo"/>
</int:outbound-channel-adapter>
同じ <outbound-channel-adapter> 構成で ref 属性と内部ハンドラー定義の両方を使用することは、あいまいな状態を作成するため許可されません。このような構成では、例外がスローされます。

channel 参照なしで任意のチャネルアダプターを作成できます。この場合、暗黙的に DirectChannel のインスタンスが作成されます。作成されたチャンネルの名前は、<inbound-channel-adapter> または <outbound-channel-adapter> 要素の id 属性と一致します。channel が提供されない場合は、id が必要です。

チャネルアダプターの式とスクリプト

他の多くの Spring Integration コンポーネントと同様に、<inbound-channel-adapter> および <outbound-channel-adapter> も SpEL 式評価のサポートを提供します。SpEL を使用するには、Bean でのメソッド呼び出しに使用される "ref" および "method" 属性を提供する代わりに、'expression' 属性で式ストリングを提供します。式が評価されると、メソッド呼び出しと同じ契約に従います。評価結果が null 以外の値である場合は常に <inbound-channel-adapter> の式がメッセージを生成しますが、<outbound-channel-adapter> の式は void と同等でなければなりません - メソッド呼び出しを返します。

Spring Integration 3.0 から、<int:inbound-channel-adapter/> は SpEL <expression/> (または <script/> でも)サブエレメントで構成できます。これは、単純な 'expression' 属性で実現できるよりも高度な機能が必要な場合に使用します。location 属性を使用して Resource としてスクリプトを提供する場合は、refresh-check-delay を設定して、リソースを定期的にリフレッシュすることもできます。スクリプトをポーリングごとにチェックする場合は、次の例に示すように、この設定をポーラーのトリガーと調整する必要があります。

<int:inbound-channel-adapter ref="source1" method="method1" channel="channel1">
    <int:poller max-messages-per-poll="1" fixed-delay="5000"/>
    <script:script lang="ruby" location="Foo.rb" refresh-check-delay="5000"/>
</int:inbound-channel-adapter>

<expression/> サブ要素を使用する場合は、ReloadableResourceBundleExpressionSource の cacheSeconds プロパティも参照してください。式の詳細については、Spring 式言語 (SpEL) を参照してください。スクリプトについては、Groovy サポートおよびスクリプトのサポートを参照してください。

<int:inbound-channel-adapter/> は、エンドポイントであり、定期的にいくつかの基になる MessageSource をポーリングすることによってメッセージフローを開始します。ポーリング時にはメッセージオブジェクトが存在しないため、式とスクリプトはルート Message にアクセスできないため、他のほとんどのメッセージング SpEL 式で使用可能なペイロードまたはヘッダープロパティはありません。このスクリプトは、ヘッダーとペイロードを持つ完全な Message オブジェクト、または基本ヘッダーを持つメッセージに追加されるペイロードのみを生成して返すことができます。