输出通道路由
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();
}
我把@ServiceActivator
从sendData
改成了IntegrationFlow
,还给路由器添加了通道映射。
我正在尝试将 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();
}
我把@ServiceActivator
从sendData
改成了IntegrationFlow
,还给路由器添加了通道映射。