我们要求侦听来自队列的消息并对传入对象执行一系列操作。
我们计划在这个用例中使用spring reactor框架,我们可以将传入的对象(来自队列)作为Flux中的事件发出,并在Flux上设置一系列映射操作,对象流动通过完成处理。
为了达到这个目的,我们尝试使用FluxSink,如下所示:
Flux<ObjectFromQueue> flux = Flux.create(fluxSink -> {
messageListener.setFluxSink(fluxSink);
//messageListener has a 'process' method that will be invoked as soon as there is a new message on the Queue.
}, FluxSink.OverflowStrategy.BUFFER);
ConnectableFlux<ObjectFromQueue> connectableFlux = flux.publish();
connectableFlux.map(o -> {
return handler1.handle(o);
}).map(o -> {
return handler2.handle(o);
}).doOnError(t -> {
errorHandler.handle(t)
}).subscribe()
connectableFlux.connect();
MessageListener实现一个Listener接口(一个自定义框架类)并覆盖'process(ObjectFromQueue)'方法,一旦队列上有消息并且在'process'方法内部我们正在调用它就会被调用
fluxSink.next(objectFromQueue);
通过这种配置,我们可以实现我们的要求,即只要Queue上有消息,MessageListener就会收到消息并且消息通过已配置的handler1和handler2运算符但是如果有任何错误在处理消息期间,由于onError是一个终端事件,磁通停止运行(即发送到预配置的运营商)。
解决此问题的最佳方法是什么?或者这是不推荐配置Flux的方法吗?如果不建议采用什么方式来达到这个要求?
答案 0 :(得分:0)
现在你有两种选择:
而不是地图使用concatMap
来获取可以应用错误处理的每值子发布商:
.concatMap(v -> Mono.just(handler1.handle(v))
.doOnError(errorHandler::handle)
.onErrorResume(Mono.empty())
)
v
,所以您还可以应用一个返回默认值的错误处理程序(但从不 {{1} })使用null
:它提供了一个handle
,如果要删除该值,您可以跳过它。
sink
并调用错误处理程序而不是catch块中的接收器。你可以改变你的错误处理程序类,以便它需要一个值,一个处理程序和一个接收器,它会隐藏try / catch。类似的东西:
try/catch