我有一个包含多个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);
})
如果你有更好的事情,请随意回答。
答案 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