チャンネルアダプター

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

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

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

Java DSL
@Bean
public IntegrationFlow source1() {
    return IntegrationFlow.from(() -> new GenericMessage<>(...),
                             e -> e.poller(p -> p.fixedRate(5000)))
                ...
                .get();
}

@Bean
public IntegrationFlow source2() {
    return IntegrationFlow.from(() -> new GenericMessage<>(...),
                             e -> e.poller(p -> p.cron("30 * 9-17 * * MON-FRI")))
                ...
                .get();
}
Java
public class SourceService {

    @InboundChannelAdapter(channel = "channel1", poller = @Poller(fixedRate = "5000"))
    Object method1() {
        ...
    }

    @InboundChannelAdapter(channel = "channel2", poller = @Poller(cron = "30 * 9-17 * * MON-FRI"))
    Object method2() {
        ...
    }
}
Kotlin DSL
@Bean
fun messageSourceFlow() =
    integrationFlow( { GenericMessage<>(...) },
                    { poller { it.fixedRate(5000) } }) {
        ...
    }
XML
<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 回呼び出され、各タスク(poll)中に、max-messages-per-poll 属性値に基づいてメソッド(メッセージの生成につながる)が 1 回呼び出されます。2 番目の構成では、ポーリングタスクはポーリングごとに 10 回、または "null" が返されるまで呼び出されます。各ポーリングが 1 秒間隔で行われる間、ポーリングごとに 10 個のメッセージが生成される可能性があります。ただし、構成が次の例のようになっている場合はどうなりますか。

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

max-messages-per-poll が指定されていないことに注意してください。後で説明するように、PollingConsumer の同一のポーラー構成(たとえば、service-activatorfilterrouter など)の 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"/>

バージョン 5.5 以降、max-messages-per-poll の 0 値には特別な意味があります。MessageSource.receive() 呼び出しを完全にスキップします。これは、maxMessagesPerPoll が後でゼロ以外の値に変更されるまで、この受信チャネルアダプターの一時停止と見なされる場合があります。コントロールバス経由。

詳細については、グローバルデフォルトポーラーも参照してください。

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

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

Java DSL
@Bean
public IntegrationFlow outboundChannelAdapterFlow(MyPojo myPojo) {
    return f -> f
             .handle(myPojo, "handle");
}
Java
public class MyPojo {

    @ServiceActivator(channel = "channel1")
    void handle(Object payload) {
        ...
    }

}
Kotlin DSL
@Bean
fun outboundChannelAdapterFlow(myPojo: MyPojo) =
    integrationFlow {
        handle(myPojo, "handle")
    }
XML
<int:outbound-channel-adapter channel="channel1" ref="target" method="handle"/>

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

適合されるチャネルが PollableChannel の場合、次の例に示すように、ポーラーサブ要素(@ServiceActivator の @Poller サブアノテーション)を指定する必要があります。

Java
public class MyPojo {

    @ServiceActivator(channel = "channel1", poller = @Poller(fixedRate = "3000"))
    void handle(Object payload) {
        ...
    }

}
XML
<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/> (SourcePollingChannelAdapter)は、基になる MessageSource のポーリングを定期的にトリガーすることにより、メッセージフローを開始するエンドポイントです。ポーリングの時点ではメッセージオブジェクトがないため、式とスクリプトはルート Message にアクセスできません。他のほとんどのメッセージング SpEL 式で使用できるペイロードまたはヘッダーのプロパティはありません。スクリプトは、ヘッダーとペイロードを含む完全な Message オブジェクト、またはフレームワークによって基本ヘッダーを含むメッセージに追加されるペイロードのみを生成して返すことができます。