没有输出的Spring Cloud Stream反应式监听器

时间:2019-01-03 23:11:29

标签: java reactive-programming spring-webflux spring-cloud-stream project-reactor

我正在使用Reactive Spring Cloud Stream,并且在创建没有输出的StreamListener时遇到问题。只要没有收到格式错误的消息,以下代码就可以工作。收到格式错误的邮件后,流量会关闭。

@StreamListener
public void handleMessage(@Input(MessagingConfig.INPUT) Flux<String> payloads) {
    payloads.flatMap(objectToSave -> reactiveMongoTemplate.insert(objectToSave)).subscribe();
}

如果我理解正确,最好让框架订阅通量,而不是手动订阅通量。当侦听器有输出时,这不是问题,因为我可以像这样简单地返回通量:

@StreamListener
@Output(MessagingConfig.OUTPUT)
public Flux<String> handleMessage(@Input(MessagingConfig.INPUT) Flux<String> payloads) {
    return payloads.flatMap(objectToSave -> reactiveMongoTemplate.insert(objectToSave));
}

该框架似乎以不关闭返回的通量的方式处理错误消息。当侦听器未指定输出时,有什么方法可以让框架处理通量?

2 个答案:

答案 0 :(得分:1)

考虑切换到使用recently adopted的Spring Cloud Function(SCF)编程模型。 基本上,只要您拥有最新的代码库(2.1.0.RC4是最新的,而RELEASE则在几天之内),就可以了。这是使用SCF编程模型的代码示例:

Error: Java exception was raised during method invocation
    at androidExec (cordova.js:963)
    at Object.cameraExport.getPicture (Camera.js:156)
    at s (vendor.js:1)
    at vendor.js:1
    at vendor.js:1
    at new t (polyfills.js:3)
    at vendor.js:1
    at S (vendor.js:1)
    at vendor.js:1
    at l.<anonymous> (vendor.js:1)

您也可以从类路径中删除反应性模块,因为我们也在考虑一起弃用它

答案 1 :(得分:0)

如果您真的想避免Oleg的答案中提到的SCF,可以尝试以下方法。

const val IN = "input"
const val OUT = "dummy-output"

interface Channels {
    @Input(IN)
    fun input(): MessageChannel

    @Output(OUT)
    fun output(): MessageChannel
}

@EnableBinding(Channels::class)
class MsgList {
    @StreamListener
    @Output(OUT)
    fun receive(@Input(IN) messages: Flux<String>): Flux<Void> {
        return messages
            .doOnNext { if (it == "err") throw IllegalStateException("err") }
            .doOnNext { println(it) }
            .flatMap { Mono.empty<Void>() }
    }
}

将创建输出绑定,但不会传递任何消息。如果使用RabbitMQ,则意味着-将出现虚拟交换,但不会创建队列。

也将按您期望的方式处理错误。在上面的示例中,您可以发送3条消息:“ ok”,“ err”,“ ok2”,然后您将在屏幕上看到“ ok”,异常,然后是“ ok2”。正确处理“ ok2”和任何后续有效消息。