最新の安定バージョンについては、Spring Integration 6.4.4 を使用してください! |
汎用ルーターの構成
Spring Integration は汎用ルーターを提供します。これを汎用ルーティングに使用できます(Spring Integration が提供する他のルーターとは異なり、各ルーターには何らかの特殊化があります)。
次のセクションでは、XML コンポーネントを使用したルーター構成について説明します。
router
要素は、ルーターを入力チャネルに接続する方法を提供し、オプションの default-output-channel
属性も受け入れます。ref
属性は、カスタムルーター実装(AbstractMessageRouter
を継承する必要があります)の Bean 名を参照します。次の例は、3 つの汎用ルーターを示しています。
<int:router ref="payloadTypeRouter" input-channel="input1"
default-output-channel="defaultOutput1"/>
<int:router ref="recipientListRouter" input-channel="input2"
default-output-channel="defaultOutput2"/>
<int:router ref="customRouter" input-channel="input3"
default-output-channel="defaultOutput3"/>
<beans:bean id="customRouterBean" class="org.foo.MyCustomRouter"/>
あるいは、ref
は @Router
アノテーションを含む POJO を指す場合があります(後述)か、ref
を明示的なメソッド名と組み合わせることができます。メソッドを指定すると、このドキュメントで後述する @Router
アノテーションセクションで説明されているのと同じ動作が適用されます。次の例では、ref
属性で POJO を指すルーターを定義しています。
<int:router input-channel="input" ref="somePojo" method="someMethod"/>
カスタムルーターの実装が他の <router>
定義で参照されている場合は、通常、ref
属性を使用することをお勧めします。ただし、カスタムルーターの実装のスコープを <router>
の単一の定義に限定する必要がある場合は、次の例に示すように、内部 Bean 定義を提供できます。
<int:router method="someMethod" input-channel="input3"
default-output-channel="defaultOutput3">
<beans:bean class="org.foo.MyCustomRouter"/>
</int:router>
同じ <router> 構成で ref 属性と内部ハンドラー定義の両方を使用することは許可されていません。そうすると、あいまいな状態が作成され、例外がスローされます。 |
ref 属性が AbstractMessageProducingHandler を継承する Bean を参照する場合(フレームワーク自体が提供するルーターなど)、構成はルーターを直接参照するように最適化されます。この場合、各 ref 属性は個別の Bean インスタンス(または prototype -scoped Bean)を参照するか、内部 <bean/> 構成型を使用する必要があります。ただし、この最適化は、ルーター XML 定義でルーター固有の属性を指定しない場合にのみ適用されます。誤って複数の Bean から同じメッセージハンドラーを参照すると、構成例外が発生します。 |
次の例は、Java で構成された同等のルーターを示しています。
@Bean
@Router(inputChannel = "routingChannel")
public AbstractMessageRouter myCustomRouter() {
return new AbstractMessageRouter() {
@Override
protected Collection<MessageChannel> determineTargetChannels(Message<?> message) {
return // determine channel(s) for message
}
};
}
次の例は、Java DSL を使用して構成された同等のルーターを示しています。
@Bean
public IntegrationFlow routerFlow() {
return IntegrationFlow.from("routingChannel")
.route(myCustomRouter())
.get();
}
public AbstractMessageRouter myCustomRouter() {
return new AbstractMessageRouter() {
@Override
protected Collection<MessageChannel> determineTargetChannels(Message<?> message) {
return // determine channel(s) for message
}
};
}
または、次の例に示すように、メッセージペイロードからデータをルーティングできます。
@Bean
public IntegrationFlow routerFlow() {
return IntegrationFlow.from("routingChannel")
.route(String.class, p -> p.contains("foo") ? "fooChannel" : "barChannel")
.get();
}