输出通道路由

时间:2016-09-24 18:24:38

标签: java spring spring-integration spelevaluationexception

我正在尝试将Spring Integration流程从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类,用于确定要使用的输出通道。它有一个返回输出通道名称的方法route,如:

@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没有订阅者”,显然是由以下原因引起的:

  

org.springframework.expression.spel.SpelEvaluationException:   EL1004E:(pos 8):方法调用:方法configure(com.example.DataType)   无法在com.example.Integration上找到$$ Lambda $ 1/1018103616类型

路由器是我的Integration类中唯一的lambda。

1 个答案:

答案 0 :(得分:0)

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

@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();
}

我从@ServiceActivatorIntegrationFlow更改为sendData,并将路径映射添加到路由器。