如何在 spring 集成 java dsl 中制作一个 header 值路由器并为其分配一个默认输出通道?

How to make a header value router in spring integration java dsl and assign it a default output channel?

我目前是这样的:

.route("headers.STATE", new Consumer<RouterSpec<ExpressionEvaluatingRouter>>() {
        @Override
        public void accept(RouterSpec<ExpressionEvaluatingRouter> spec) {
            spec
                .channelMapping(ProcStatus.NORMAL_OPERATION.toString(), "primaryChannel")
                .channelMapping(ProcStatus.FAILED_OVER.toString(), "secondaryChannel")
                .channelMapping(ProcStatus.UNKNOWN.toString(), "stateRetrievalChannel");
                }
            })

但它本身并不是真正的 header 价值路由器,对吗?我似乎无法将 HeaderValueRouter 设置为路由规范,只能在第一个参数上给出 header 的名称。

此外,我在规范中找不到默认频道映射。感谢您的帮助!

老实说,<header-value-router> 自引入 SpEL 路由器以来就没有意义了,您可以像 expression="headers.STATE" 一样简单地配置它,就像在 [=47= 的配置中一样] DSL.

对于任何类型的 Router 实施,其他一切都是相同的。 在 reference manual.

中查看更多信息

而且,是的,您也可以直接使用 HeaderValueRouter

.route(new HeaderValueRouter("STATE"), new Consumer<RouterSpec<ExpressionEvaluatingRouter>>() {
    @Override
    public void accept(RouterSpec<ExpressionEvaluatingRouter> spec) {
        spec
            .channelMapping(ProcStatus.NORMAL_OPERATION.toString(), "primaryChannel")
            .channelMapping(ProcStatus.FAILED_OVER.toString(), "secondaryChannel")
            .channelMapping(ProcStatus.UNKNOWN.toString(), "stateRetrievalChannel");
            }
        })

但如您所见,.channelMapping() 保持不变。

至于"default channel mapping"。我想你只是指 default-output-channel,我们在 XML 配置中有它。

如果您注意到 SI Java DSL 中没有任何组件具有 output-channel 选项(default-output-channel 起着相同的作用)。我们只是将 IntegrationFlow 中的下一个 .channel() 定义传播到当前的 outputChannel 感知组件。因此,要将 default-output-channel 映射到 .route(),您应该在方法链中继续使用 IntegrationFlow 定义。像这样:

.route()
.handle()

因此,如果路由条件不满足任何.channelMapping()resolutionRequired == false,消息将通过它们之间的隐式DirectChannel发送到下一个.handle() .