输出通道路由

Output channel routing

我正在尝试将 Spring 集成流程从 XML 重写为 Java。我想路由通过通道发送的数据:

@Bean(name = "sendData")
public MessageChannel getSendData() {
    return MessageChannels.direct()
                          .get();
}

进入另外两个频道:

@Bean(name = "sendDataA")
public MessageChannel getSendDataA() {
    return MessageChannels.direct()
                          .get();
}

@Bean(name = "sendDataB")
public MessageChannel getSendDataB() {
    return MessageChannels.direct()
                          .get();
}

取决于他们的可用性。

我有一个 RoundRobinRouter class 来决定使用哪个输出通道。它有一个方法 route returns 输出通道名称,例如:

@Component
class RoundRobinRouter {
    public String route(Object payload) {
        /* implementation */
    }
}

请注意,route 方法实现实际上并不使用 payload 对象。之前放在XML配置中:

<int:router method="route" input-channel="sendData"
            default-output-channel="sendDataA">
    <bean
            class="com.example.RoundRobinRouter"/>
</int:router>

我已经尝试使用 Java DSL IntegrationFlow:

@Bean
@ServiceActivator(inputChannel = "sendData",
                  outputChannel = "sendDataA")
public IntegrationFlow routeRoundRobin() {
    return router -> router.route(roundRobinRouter, "route");
}

但我在 sendData.send(payload) 调用时收到错误 "Dispatcher has no subscribers",显然是由于:

org.springframework.expression.spel.SpelEvaluationException: EL1004E:(pos 8): Method call: Method configure(com.example.DataType) cannot be found on com.example.Integration$$Lambda/1018103616 type

路由器是我集成中唯一的 lambda class。

好的,我让它工作了。我不确定哪个更改解决了我的问题,但这是正确的路由器实现:

@Bean
public IntegrationFlow routeRoundRobin() {
    return IntegrationFlows.from(getSendData())
                           .route(roundRobinRouter, "route",
                                  r -> r.channelMapping("sendDataA",
                                                        "sendDataA")
                                        .channelMapping("sendDataB",
                                                        "sendDataB"))
                           .get();
}

@Bean(name = "sendData")
public MessageChannel getSendData() {
    return MessageChannels.direct()
                          .get();
}

@Bean(name = "sendDataA")
public MessageChannel getSendDataA() {
    return MessageChannels.direct()
                          .get();
}

@Bean(name = "sendDataB")
public MessageChannel getSendDataB() {
    return MessageChannels.direct()
                          .get();
}

我把@ServiceActivatorsendData改成了IntegrationFlow,还给路由器添加了通道映射。