Конфигурация маршрутизатора значений заголовка Spring Integration - PullRequest
0 голосов
/ 28 мая 2018

Я настраиваю маршрутизатор значений заголовка с выходом канала по умолчанию, но, похоже, следующий код написан неправильно.

@Autowired
@Qualifier("defaultRouterChannel")
MessageChannel defaultRouterChannel; //PubSub channel

@Bean
public IntegrationFlow amqpFlow() {
    return IntegrationFlows
            .from("rabbitMqChannel")
            .transform(Transformers.fromJson(Agreement.class))
            .route(router())
            .get();
}


public HeaderValueRouter router() {
    HeaderValueRouter router = new HeaderValueRouter(AGREEMENT_HEADER);
    router.setDefaultOutputChannel(defaultRouteChannel);
    router.setChannelMapping("ENROLL", "enrollChannel");
    router.setChannelMapping("ENLIST", "enlistChannel");
    return router;
}


@Bean
public IntegrationFlow defaultRoute() {
    return IntegrationFlows
            .from(defaultRouterChannel)
            .log()
            .get();
}

В документации упоминается следующее: «Установите канал по умолчанию, куда должны отправляться сообщения, если при разрешении канала не удается вернуть какие-либо каналы. Если канал по умолчанию не предоставлен, а при разрешении канала не удается вернуть какие-либо каналы, маршрутизаторвызовет MessageDeliveryException. "

Проблема в том, что когда отправляется действительный" заголовок соглашения "" пока все хорошо ", но когда я проверяю маршрутизатор с" неверным заголовком ", он выдает" MessageDeliveryException"

следующим образом.

Предположим, что я отправляю заголовок со значением "LOCAL"

Причина: org.springframework.messaging.MessagingException: не удалось разрешить имя канала 'LOCAL';вложенным исключением является org.springframework.messaging.core.DestinationResolutionException: не удалось найти MessageChannel с именем 'LOCAL' в BeanFactory .;Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: нет объекта с именем 'LOCAL', доступного в org.springframework.integration.router.AbstractMappingMessageRouter.resolveChannelForName (AbstractMappingMessage.oug.rage.rara.rag.terge.rater.r).addChannelFromString (AbstractMappingMessageRouter.java:258) при org.springframework.integration.router.AbstractMappingMessageRouter.addToCollection (AbstractMappingMessageRouter.java:282) при org.springframework.integration.router.AbstractMappingMessageRouter.determineTargetChannels (AbstractMappingMessageRouter.java:186) при org.springframework.integration.router.AbstractMessageRouter.handleMessageInternal (AbstractMessageRouter.java:171) в org.springframework.integration.handler.AbstractMessageHandler.handleMessage (АбстрактMessageHandler.java:158): 116) в org.springfСценарийJava: 73) в org.springframework.integration.channel..GenericMessagingTemplate.doSend (GenericMessagingTemplate.java:181) по адресу org.springframework.messaging.core.GenericMessagingTemplate.doSend (GenericMessagingTemplate.java:160) по адресу org.springframeessice.org.springframework.messaging.core.AbstractMessageSendingTemplate.send (AbstractMessageSendingTemplate.java:108) в org.springframework.integration.handler.AbstractMessageProroductionHandler.sendOutput (AbstractMessageProroductionHandler.java:426) в org.springframework.integration.handler.AbstractMessageProroductionHandler.produceOutput (AbstractMessageProroductionHandler.java:336) в org.sage.Message.springframework.integration.handler..java: 224) в org.springframework.integration.dispatcher.BroadcastingDispatcher.access $ 000 (BroadcastingDispatcher.java:56)по адресу org.springframework.integration.dispatcher.BroadcastingDispatcher $ 1.run (BroadcastingDispatcher.java:204) по адресу org.springframework.integration.util.ErrorHandlingTaskExecutor.lambda $ execute $ 0 (ErrorHandlingTaskExectilcon.java.jp:.runWorker (ThreadPoolExecutor.java:1149) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624)

Spring Integration версии 5.0.5

С уважением.

1 Ответ

0 голосов
/ 28 мая 2018

В документации также сказано:

Сообщение будет отправлено на default-output-channel, только если resolution-required равно false и канал не разрешен.

Оба свойства описаны как

default-output-channel

Если установлено, этот атрибут предоставляет ссылку на канал, куда должны отправляться сообщения,если разрешение канала не возвращает какие-либо каналы.Если выходной канал по умолчанию не предоставлен, маршрутизатор выдаст исключение.Если вы хотите вместо этого молча отбросить эти сообщения, добавьте nullChannel в качестве значения атрибута выходного канала по умолчанию.

[Примечание] Сообщение будет отправлено на канал вывода по умолчанию, только если для параметра Resolution-required указано значение falseи канал не разрешен.

разрешение требуется

Если true, этот атрибут указывает, что имена каналов всегда должны быть успешно разрешены в существующих экземплярах канала.Если установлено значение true, будет возникать исключение MessagingException, если канал не может быть разрешен.Если для этого атрибута установлено значение false, любые нереализуемые каналы будут игнорироваться. Этот необязательный атрибут, если он не задан явно, по умолчанию имеет значение true.

[Примечание] Сообщение будет отправляться только на канал вывода по умолчанию, если он указан, когда требуется разрешениеложно, и канал не разрешен.

...