Reactor有没有办法忽略错误信号?

时间:2018-01-13 19:41:20

标签: java project-reactor

我有一个包含多个URL和端口的数组。对于他们每个人,我需要收发回复:

Flux.fromArray(trackersArray)
    .flatMap(tracker -> 
               ConnectToTracker.connect(tracker.getTracker(), tracker.getPort()))

我与UDP中的服务器进行通信,因此我无法判断服务器是否处于活动状态,除非我发送的消息符合某些规则,需要回应它。

ConnectToTracker.connect可能会在服务器响应时发送onNext信号,或者onError信号,例如,如果服务器没有响应(SocketTimeOutException)或任何其他失败(一般IOException)。

例如,如果flux信号等于onError,我就不想终止SocketTimeOutException相反,我想尝试与我得到的每个跟踪器进行通信。

This link包含我可用于处理错误的所有操作但不会忽略它们。

如果这很重要,我会使用Reactor 3

更新

我做了一个丑陋的技巧,但是有效:

Flux.fromArray(trackersArray)
        .handle((Tracker tracker, SynchronousSink<ConnectResponse> sink) -> {
            ConnectToTracker.connect(tracker.getTracker(), tracker.getPort())
                    .subscribe(sink::next, error -> {
                        if (!(error instanceof SocketTimeoutException))
                            sink.error(error);
                    }, sink::complete);
        })

如果你有更好的事情,请随意回答。

3 个答案:

答案 0 :(得分:4)

现在我们有了reactor.core.publisher.onErrorContinue()版本的3.3.2,当某些元素为onNext()时,它允许您发送onError()信号。使用log(),您会看到更好的结果。

签名为(throwable, instance),因此,如果您要记录错误的签名,将很有用。

Flux.fromIterable(aList)
    .flatMap(this::xxxx)
    .onErrorContinue((throwable, o) -> {
        log.error("Error while processing {}. Cause: {}", o, throwable.getMessage());
})
    ....

答案 1 :(得分:2)

由于您已经在平面地图中处理网址,因此请使用onErrorResume(e -> Mono.empty())。这将让flatmap忽略错误。 编辑:在flatmap内,在lambda的右侧

答案 2 :(得分:1)

Flux.fromArray(trackersArray)
.flatMap(tracker -> 
           ConnectToTracker.connect(tracker.getTracker(), tracker.getPort())
                .onErrorResume(SocketTimeoutException.class, __ -> Mono.empty()))

也许这样做会更好,它会从SocketTimeOut恢复,如果异常是其他我会去onError