Spring Integration: Контентный маршрутизатор с выходным каналом по умолчанию? - PullRequest
8 голосов
/ 27 июля 2011

Я бы хотел использовать Spring Integration для реализации основанного на контенте маршрутизатора, который использует выходной канал по умолчанию, если значение выражения не соответствует ни одному из сопоставлений.Вот мое определение бина:

<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», маршрутизатор, похоже, ищет канал с именем «baz» вместо маршрутизации на канал «channel_default»:

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, или мне нужно кодировать мою собственную реализацию?

Ответы [ 3 ]

10 голосов
/ 27 июля 2011

Оказывается, что все, что мне нужно было сделать для этой работы, это установить для атрибута 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>

Я думал, что пытался сделать это раньше, но, похоже, не пытался.

0 голосов
/ 11 июля 2019

Как указано в справочных документах :

Начиная с Spring Integration 2.1, параметры маршрутизатора были больше стандартизирован во всех реализациях маршрутизаторов. Следовательно, несколько незначительные изменения могут сломать старые приложения на основе Spring Integration.

С весны интеграции 2.1, ignore-channel-name-resolution-failures атрибут удален в пользу консолидации его поведения с атрибутом resolution-required. Кроме того, для разрешения по умолчанию теперь требуется значение по умолчанию true.

До этих изменений атрибут resolution-required по умолчанию false, в результате чего сообщения автоматически отбрасывались, когда ни один канал разрешен и не установлен default-output-channel. Новое поведение требует как минимум один разрешенный канал и по умолчанию выбрасывает 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();
0 голосов
/ 07 июня 2019

, если вы используете для весенней загрузки 2.1.2.RELEASE

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-integration</artifactId>
</dependency>

, тогда resolution-required = "false" требуется вместо ignore-channel-name-resolution--сбои.

<int:router input-channel="channel_in" default-output-channel="channel_default" 
  expression="payload.name" resolution-required="false">
    <int:mapping value="foo" channel="channel_one" />
    <int:mapping value="bar" channel="channel_two" />
</int:router>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...