Java Spring集成头值路由器配置

Java Spring集成头值路由器配置,java,spring,spring-integration,Java,Spring,Spring Integration,我正在配置一个带有默认通道输出的头值路由器,但是下面的代码似乎没有正确编写 @Autowired @Qualifier("defaultRouterChannel") MessageChannel defaultRouterChannel; //PubSub channel @Bean public IntegrationFlow amqpFlow() { return IntegrationFlows .from("rabbitMqChannel")

我正在配置一个带有默认通道输出的头值路由器,但是下面的代码似乎没有正确编写

@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.MessagineException:无法解析通道名称“LOCAL”;嵌套异常为org.springframework.messaging.core.DestinationResolutionException:未能在BeanFactory中查找名为“LOCAL”的MessageChannel。;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为“LOCAL”的bean可用 位于org.springframework.integration.router.AbstractMappingMessageRouter.resolveChannelForName(AbstractMappingMessageRouter.java:227) 位于org.springframework.integration.router.AbstractMappingMessageRouter.addChannelFromString(AbstractMappingMessageRouter.java:258) 位于org.springframework.integration.router.AbstractMappingMessageRouter.addToCollection(AbstractMappingMessageRouter.java:282) 位于org.springframework.integration.router.AbstractMappingMessageRouter.DeterminiteTargetChannel(AbstractMappingMessageRouter.java:186) 位于org.springframework.integration.router.AbstractMessageRouter.handleMessageInternal(AbstractMessageRouter.java:171) 位于org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:158) 位于org.springframework.integration.dispatcher.AbstractDispatcher.tryoOptimizedDispatch(AbstractDispatcher.java:116) 位于org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:132) 位于org.springframework.integration.dispatcher.UnicastingDispatcher.dispatcher(UnicastingDispatcher.java:105) 位于org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73) 位于org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:445) 位于org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:394) 位于org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:181) 位于org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:160) 位于org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47) 位于org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:108) 位于org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:426) 位于org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:336) 位于org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:227) 位于org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:115) 位于org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:158) 位于org.springframework.integration.dispatcher.BroadcastingDispatcher.invokeHandler(BroadcastingDispatcher.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(ErrorHandlingTaskExecutor.java:53) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

Spring集成版本5.0.5


亲切问候。

文件中还说

如果
需要分辨率
false
且通道未解析,则消息将仅发送到
默认输出通道

这两个属性描述为

默认输出通道

如果设置了此属性,则当通道解析无法返回任何通道时,该属性提供对通道的引用,消息应发送到该通道。如果没有提供默认输出通道,路由器将抛出异常。如果要以静默方式删除这些消息,请添加nullChannel作为默认输出通道属性值

[注] 只有当所需分辨率为false且通道未解析时,才会将消息发送到默认输出通道

需要分辨率

如果为true,则此属性指定通道名称必须始终成功解析为存在的通道实例。如果设置为true,将引发MessaginException,以防无法解析通道。将此属性设置为false将导致忽略任何不可编辑的通道如果未明确设置,此可选属性将默认为true。

[注] 仅当所需分辨率为false且通道未解析时,才会将消息发送到默认输出通道(如果指定)


为了简单起见,并非所有配置都显示出来;你好,加里,谢谢你的回复。正如我提到的,“可能”没有正确配置。更改为“public HeaderValueRouter”(public HeaderValueRouter)