9

式の値がどのマッピングにも一致しない場合、Spring Integration を使用して、デフォルトの出力チャネルを使用するコンテンツ ベースのルーターを実装したいと考えています。これが私のBean定義です:

<int:router input-channel="channel_in" default-output-channel="channel_default" expression="payload.name">
    <int:mapping value="foo" channel="channel_one" />
    <int:mapping value="bar" channel="channel_two" />

ただし、デフォルトの出力チャネルは使用されていないようです。式が「baz」などと評価される場合、ルーターは「channel_default」チャネルにルーティングするのではなく、「baz」という名前のチャネルを探しているようです。

org.springframework.integration.MessagingException: failed to resolve channel name 'baz'
  Caused by: org.springframework.integration.support.channel.ChannelResolutionException: 
    failed to look up MessageChannel bean with name 'baz'
  Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
    No bean named 'baz' is defined

XML 名前空間を使用して、私が望んでいることはまったく可能ですか?それとも、独自の実装をコーディングする必要がありますか?

4

3 に答える 3

10

この作業を行うために必要だったのは、ルーターの ignore-channel-name-resolution-failures 属性を false に設定することだけでした。

<int:router input-channel="channel_in" default-output-channel="channel_default" 
  expression="payload.name" ignore-channel-name-resolution-failures="true">
    <int:mapping value="foo" channel="channel_one" />
    <int:mapping value="bar" channel="channel_two" />
</int:router>

以前に試したことがあると思っていましたが、そうではなかったようです。

于 2011-07-27T15:27:06.137 に答える
1

参照ドキュメントで述べたように:

Spring Integration 2.1 の時点で、ルーター パラメーターはすべてのルーター実装でより標準化されています。その結果、いくつかのマイナーな変更により、古い Spring Integration ベースのアプリケーションが機能しなくなる可能性があります。

Spring Integration 2.1 以降、 ignore-channel-name-resolution-failures属性は、その動作を属性に統合するために削除されましたresolution-required。また、resolution-required 属性のデフォルトが になりましたtrue

これらの変更の前は、resolution-required属性はデフォルトで に設定されて いたためfalse、解決されたチャネルがなく、nodefault-output-channelが設定されている場合、メッセージがサイレントにドロップされていました。新しい動作には、少なくとも 1 つの解決されたチャネルが必要であり、既定では、 MessageDeliveryExceptionチャネルが決定されなかった場合 (または送信の試行が失敗した場合) をスローします。

メッセージをサイレントにドロップしたい場合は、 を設定できます default-output-channel="nullChannel"

また、Java DSL を使用している場合、構成は次のようになります。

IntegrationFlows.from("process")
        .<JobExecution, String>route(m -> m.getExitStatus().getExitCode(),
                m -> m.channelMapping(ExitStatus.COMPLETED.getExitCode(), "succeed")
                        .defaultOutputChannel("failed")
                        .resolutionRequired(false))
        .get();
于 2019-07-11T11:56:26.977 に答える