我正在使用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));
}
该框架似乎以不关闭返回的通量的方式处理错误消息。当侦听器未指定输出时,有什么方法可以让框架处理通量?
答案 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”和任何后续有效消息。