我正在尝试将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。
答案 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();
}
我从@ServiceActivator
将IntegrationFlow
更改为sendData
,并将路径映射添加到路由器。