チャンネルアダプター
チャネルアダプターは、単一の送信者または受信者をメッセージチャネルに接続できるようにするメッセージエンドポイントです。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
Java
Kotlin DSL
XML
@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();
}
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() {
...
}
}
@Bean
fun messageSourceFlow() =
integrationFlow( { GenericMessage<>(...) },
{ poller { it.fixedRate(5000) } }) {
...
}
<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>
チャネルアダプターの式とスクリプトも参照してください。
ポーラーが提供されない場合、単一のデフォルトポーラーをコンテキスト内に登録する必要があります。詳細については、エンドポイント名前空間のサポートを参照してください。 |
ポーリングエンドポイントのデフォルトのトリガーは、1 秒の固定遅延期間を持つ PeriodicTrigger インスタンスです。 |
重要: ポーラー構成 すべての
最初の構成では、ポーリングタスクはポーリングごとに 1 回呼び出され、各タスク(poll)中に、
ただし、 ただし、メソッドが null を返すことが確実で、ポーリングごとに利用可能なソースをできるだけ多くポーリングする必要がある場合は、次の例に示すように、
バージョン 5.5 以降、 バージョン 6.2 以降、 詳細については、グローバルデフォルトポーラーも参照してください。 |
送信チャネルアダプターの構成
outbound-channel-adapter
要素(Java 構成の場合は @ServiceActivator
)は、MessageChannel
を、そのチャネルに送信されるメッセージのペイロードで呼び出す必要のある任意の POJO コンシューマーメソッドに接続することもできます。次の例は、送信チャネルアダプターを定義する方法を示しています。
Java DSL
Java
Kotlin DSL
XML
@Bean
public IntegrationFlow outboundChannelAdapterFlow(MyPojo myPojo) {
return f -> f
.handle(myPojo, "handle");
}
public class MyPojo {
@ServiceActivator(channel = "channel1")
void handle(Object payload) {
...
}
}
@Bean
fun outboundChannelAdapterFlow(myPojo: MyPojo) =
integrationFlow {
handle(myPojo, "handle")
}
<int:outbound-channel-adapter channel="channel1" ref="target" method="handle"/>
<beans:bean id="target" class="org.MyPojo"/>
適合されるチャネルが PollableChannel
の場合、次の例に示すように、ポーラーサブ要素(@ServiceActivator
の @Poller
サブアノテーション)を指定する必要があります。
Java
XML
public class MyPojo {
@ServiceActivator(channel = "channel1", poller = @Poller(fixedRate = "3000"))
void handle(Object payload) {
...
}
}
<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 オブジェクト、またはフレームワークによって基本ヘッダーを含むメッセージに追加されるペイロードのみを生成して返すことができます。 |