作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要使用 PayloadTypeRouter
并希望将路由消息直接发送到 Transformer
, Filter
或 ServiceActivator
.所有都应该使用 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
语法目前不受支持。
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)...
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/
我是一名优秀的程序员,十分优秀!