对于最新的稳定版本,请使用 Spring Integration 6.4.0! |
子流支持
某些 and 组件提供了使用子流指定其逻辑或映射的功能。
最简单的示例是 ,如下例所示:if…else
publish-subscribe
.publishSubscribeChannel()
@Bean
public IntegrationFlow subscribersFlow() {
return flow -> flow
.publishSubscribeChannel(Executors.newCachedThreadPool(), s -> s
.subscribe(f -> f
.<Integer>handle((p, h) -> p / 2)
.channel(c -> c.queue("subscriber1Results")))
.subscribe(f -> f
.<Integer>handle((p, h) -> p * 2)
.channel(c -> c.queue("subscriber2Results"))))
.<Integer>handle((p, h) -> p * 3)
.channel(c -> c.queue("subscriber3Results"));
}
您可以使用单独的定义获得相同的结果,但我们希望您发现 logic composition 的 sub-flow 风格很有用。
我们发现它会导致更短(因此更具可读性)的代码。IntegrationFlow
@Bean
从版本 5.3 开始,提供了一个基于 的实现,用于在代理支持的消息通道上配置子流订阅者。
例如,我们现在可以将多个订阅者配置为 :BroadcastCapableChannel
publishSubscribeChannel()
Jms.publishSubscribeChannel()
@Bean
public JmsPublishSubscribeMessageChannelSpec jmsPublishSubscribeChannel() {
return Jms.publishSubscribeChannel(jmsConnectionFactory())
.destination("pubsub");
}
@Bean
public IntegrationFlow pubSubFlow(BroadcastCapableChannel jmsPublishSubscribeChannel) {
return f -> f
.publishSubscribeChannel(jmsPublishSubscribeChannel,
pubsub -> pubsub
.subscribe(subFlow -> subFlow
.channel(c -> c.queue("jmsPubSubBridgeChannel1")))
.subscribe(subFlow -> subFlow
.channel(c -> c.queue("jmsPubSubBridgeChannel2"))));
}
类似的子流组合提供了该方法。publish-subscribe
.routeToRecipients()
另一个示例是 using instead of on 方法。.discardFlow()
.discardChannel()
.filter()
值得特别关注。
请考虑以下示例:.route()
@Bean
public IntegrationFlow routeFlow() {
return f -> f
.<Integer, Boolean>route(p -> p % 2 == 0,
m -> m.channelMapping("true", "evenChannel")
.subFlowMapping("false", sf ->
sf.<Integer>handle((p, h) -> p * 3)))
.transform(Object::toString)
.channel(c -> c.queue("oddChannel"));
}
它继续像在常规映射中一样工作,但将该子流绑定到主流。
换句话说,任何路由器的子流在 之后都会返回到主流。.channelMapping()
Router
.subFlowMapping()
.route()
有时,您需要从 中引用 existing 。
以下示例显示了如何执行此操作:
Caused by: org.springframework.beans.factory.BeanCreationException: The 'currentComponent' (org.springframework.integration.router.MethodInvokingRouter@7965a51c) is a one-way 'MessageHandler' and it isn't appropriate to configure 'outputChannel'. This is the end of the integration flow. 当您将子流配置为 lambda 时,框架会处理与子流的请求-回复交互,并且不需要网关。 |
子流可以嵌套到任何深度,但我们不建议这样做。 事实上,即使在路由器的情况下,在流中添加复杂的子流也会很快开始看起来像一盘意大利面,人类很难解析。
在 DSL 支持子流配置的情况下,当正在配置的组件通常需要通道,并且该子流以元素开头时,框架会在组件输出通道和流的输入通道之间隐式放置一个。
例如,在此定义中:
框架在内部创建一个 Bean,用于注入到 .
然后,它将子流包装到订阅的此隐式渠道的开头,并将 a 放在流中指定的之前。
当现有 bean 用作子流引用(而不是内联子流,例如 lambda)时,不需要这样的桥,因为框架可以解析流 bean 中的第一个通道。
对于内联子流,输入通道尚不可用。 |