组合入站通道适配器和流发射器

时间:2018-03-16 12:24:10

标签: kotlin spring-integration spring-cloud-stream reactive

我正在玩春天的云流反应,我正面临着一个问题。

请考虑以下代码:

@InboundChannelAdapter("list", poller = [(Poller(fixedDelay = "\${thetis.listInterval:60000}"))])
fun timerMessageSource(): Flux<Center> = config.centers.toFlux()

我的目标是产生一种通过以下形式消耗的通量:

 @StreamListener("list") @Output("download")
 fun processList(center: Center): Flux<Product> = ...

但这似乎不起作用。通道适配器正确生成通量,但它说明如下:

 org.springframework.messaging.converter.MessageConversionException: Could not read JSON: Unrecognized token 'FluxIterable': was expecting ('true', 'false' or 'null')

我认为我将在入站通道适配器中添加StreamEmitter注释,但这似乎不起作用。

实施此类流程的正确方法是什么?

谢谢你,问候,

费尔南多

1 个答案:

答案 0 :(得分:1)

异常非常明确:您生成一个Flux对象作为消息的payload,以发送到list通道,以发送到消息传递中间件上的目标目标。并且它完全正确Flux原样与要序列化的JSON不兼容。

另一方面,我不确定什么是Kotlin并将您的代码编译为Java,但我们已经开箱即用(对于Java):

@StreamEmitter
@Output("list")
public Flux<Center> timerMessageSource() {
     return config.centers.toFlux();
}

并且助焊剂中的每个发射项目将被序列化并作为记录或消息发送给Binder。如果您的Center与JSON兼容,当然。为此,您需要spring-cloud-stream-reactive依赖项。

是的,@InboundChannelAdapter在这里没有帮助甚至是干扰。

如果您担心某些定期发射,请考虑在Project Reactor中安排支持。