最新の安定バージョンについては、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();
}