处理不断发出事件的FluxSink中的错误

时间:2017-08-22 18:24:37

标签: project-reactor

我们要求侦听来自队列的消息并对传入对象执行一系列操作。

我们计划在这个用例中使用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的方法吗?如果不建议采用什么方式来达到这个要求?

1 个答案:

答案 0 :(得分:0)

现在你有两种选择:

  • 而不是地图使用concatMap来获取可以应用错误处理的每值子发布商:

    .concatMap(v -> Mono.just(handler1.handle(v))
                        .doOnError(errorHandler::handle)
                        .onErrorResume(Mono.empty())
    )
    
    • 在上面的示例中,带有空Mono的onErrorResume可归结为删除错误值。
    • 因为您仍然在concatMap中并因此可以访问v,所以您还可以应用一个返回默认值的错误处理程序(但从不 {{1} })
  • 使用null:它提供了一个handle,如果要删除该值,您可以跳过它。

    • 通常你会做一个sink并调用错误处理程序而不是catch块中的接收器。
    • 你可以改变你的错误处理程序类,以便它需要一个值,一个处理程序和一个接收器,它会隐藏try / catch。类似的东西:

      try/catch