gpt4 book ai didi

spring - PayloadTypeRouter 直接发送到 Transformer 中间没有 channel ?

转载 作者:行者123 更新时间:2023-12-04 08:08:05 25 4
gpt4 key购买 nike

我需要使用 PayloadTypeRouter并希望将路由消息直接发送到 Transformer , FilterServiceActivator .所有都应该使用 Kotlin DSL(或 Java DSL)进行配置。
目前,一个漂亮的代码部分如下所示:

    @Bean
fun routeAzureC2DMessage() = integrationFlow {
channel(IoTHubChannelNames.IOTHUB_TO_DEVICE_CHANNEL)
route<IotHubC2DRequestMessage<IotHubC2DRequest>> {
when (it.payload) {
is IotHubDesiredPropertyUpdate -> IoTHubChannelNames.DESIRED_PROPERTY_UPDATE
is IotHubMessageToDevice -> IoTHubChannelNames.MESSAGE_TO_DEVICE
}
}
}
然后继续(路由的一侧)
    @Bean
fun processMessageToDevice() = integrationFlow {
channel(IoTHubChannelNames.MESSAGE_TO_DEVICE)
filter(StructureFilter())
transform(MessageTransformer())
channel(SharedChannelNames.CLOUD2DEVICE)
}
我想去掉不需要的 channel IoTHubChannelNames.MESSAGE_TO_DEVICE .我尝试了几种方法,在项目的另一部分我想出了这样的东西(Java DSL)
IntegrationFlows
.from(channelName)
.route({ message: IotHubMessage -> message.javaClass }) { router: RouterSpec<Class<*>?, MethodInvokingRouter?> ->
router
.subFlowMapping(DeviceToCloudMessage::class.java) {
it.handle(gateway, "handleD2CMessage")
}
.subFlowMapping(DeviceTwinUpdateMessage::class.java) {
it.handle(gateway, "handleDeviceTwinReportedProperty")
}
}
.get()
subFlowMapping是摆脱中间 channel 的唯一方法吗?我想要一个我仍然可以使用的解决方案 when (it.payload)然后代替 channel / channel 名称可以返回一个新的 integrationFlow或某种其他形式的 Flow 定义。

最佳答案

目前唯一的解决方案是通过 API:

inline fun <reified P, T> route(
crossinline function: (P) -> T,
crossinline configurer: KotlinRouterSpec<T, MethodInvokingRouter>.() -> Unit) {
你在问什么 when(...) is语法目前不受支持。
随意就此事提出 GH 问题,并尽可能详细地分享 Kotlin 的观点以及如何在 Spring Integration DSL 中使用它的细节。
更新
另一方面,目前的 Kotlin 支持还不错:
            route<Int, Boolean>({ it % 2 == 0 }) {
subFlowMapping(true) { handle<Int> { p, _ -> p * 2 } }
subFlowMapping(false) { handle<Int> { p, _ -> p * 3 } }
}
所以, route() 的论点方法是 when()subFlowMapping()is->输出为 integrationFlow生成器结果。所以,可能我们不会追求 Kotlin when()除非我们输了,否则不会给我们带来太多 yield subFlowMapping赞成 ->运算符(operator)...
更新 2
在进一步考虑并寻找可能的解决方案之后,我不得不撤回我对此的请求 when() -kind 功能请求。 IntegrationFlow的主要问题在使用之前,必须预先在应用程序上下文中注册其所有配置。您在问 when()原来的路由器功能不是框架可以检测和处理的。此功能不是框架的一部分,负责产生的结果。
好吧,我们可以检查 IntegrationFlow return 决定如何调用,但不能保证您将从该函数返回的流是已注册的 bean。当我们真正注册它并尝试在这样的函数中使用时,这与我们迄今为止从该函数返回的 channel 以及它们在某个流 bean 中的映射没有什么不同。
我们可以注册 IntegrationFlow在一些为此指令设计的自动为 bean,如 subFlowMapping() .无论如何,它只在配置阶段完成一次。但是当最终用户代码在运行时返回流时,这样做并不是很好。最好返回 channel 或其他一些我们对现有流进行映射的键。
我个人更喜欢不要忽略 MessageChannel抽象并在我需要在不同流之间分配逻辑时使用它。当单个流中的代码是线性的并且代表单个逻辑工作单元时,它看起来更清晰。不过,其他流程可能会在其他逻辑中重用。我只需要指向那些来自其他地方的流输入 channel !
尽管如此,我的主要观点是:我们必须注册并 IntegrationFlow在我们向它发送消息之前。

关于spring - PayloadTypeRouter 直接发送到 Transformer 中间没有 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66123354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com