Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 项目反应堆&x27;在处理错误期间,s Flux获取失败的项目_Java_Reactive Programming_Project Reactor - Fatal编程技术网

Java 项目反应堆&x27;在处理错误期间,s Flux获取失败的项目

Java 项目反应堆&x27;在处理错误期间,s Flux获取失败的项目,java,reactive-programming,project-reactor,Java,Reactive Programming,Project Reactor,我需要处理Fluxstream错误,为此,我需要知道哪些项失败。似乎方法doError应该适用于处理错误,但有了它,我只能得到异常,而不能得到失败项。是否有任何方法可以同时获取失败项和异常 private void testFluxIterableFlow() { Flux.fromIterable(Arrays.asList(1, 2, 3, 4, 5)) .map(this::process) .doOnError(ex -> {

我需要处理
Flux
stream错误,为此,我需要知道哪些项失败。似乎方法
doError
应该适用于处理错误,但有了它,我只能得到异常,而不能得到失败项。是否有任何方法可以同时获取失败项和异常

private void testFluxIterableFlow() {
    Flux.fromIterable(Arrays.asList(1, 2, 3, 4, 5))
            .map(this::process)
            .doOnError(ex -> {
                ...
            })
            .doOnNext(processedValue -> ...)
            .subscribe();
}

private String process(Integer value) {
    if (value == 4) {
        throw new RuntimeException("error...");
    }
    return "processed " + value;
}

在本例中,我需要在错误处理程序中接收失败项
4
和异常消息。

如果某个值导致异常,则应将该值视为异常原因

由您决定是否值得添加新的异常类型

@RequiredArgsConstructor
public class WrongValueInStreamException extends RuntimeException {
    @Getter
    private final Object wrongValue;
}

public class StreamProcessor {
    public String process(Integer value) {
        if (value == 4) {
            throw new WrongValueInStreamException(4);
        }
        return "processed " + value;
    }
}
但只要异常传递有用和相关的信息,这就是一种良好的做法:

.doOnError(WrongValueInStreamException.class::isInstance, e -> {
    final Object value = ((WrongValueInStreamException) e).getWrongValue();
    // use 'value'
})

有点晚了但万一有人需要。。。您可能想做的是使用onErrorContinue。请注意,此方法将从通量中删除错误项并继续处理,因此请务必记住这一点。如果您想要error+项并停止所有操作,我相信如果您从这个方法中重新抛出异常,并且没有其他继续,那么它应该终止通量。下面是我使用kafka反应式api的一个示例

此外,传递给onErrorContinue的项将不是通量中的原始项,而是在反应链中的步骤中尝试处理的对象。例如,如果链在尝试转换B->C时失败,但在转换A->B之后,处理程序中得到的对象将是B

@EventListener(ApplicationReadyEvent.class)
public void process() {
    receiver.receiveAutoAck()
            .concatMap(Function.identity())
            .flatMap(this::deserialzeRecord)
            .flatMap(this::processEvent)
            .flatMap(responseSender::send)
            .onErrorContinue(this::handleRecordError)
            .subscribe();
}

private void handleRecordError(Throwable throwable, Object record) {
    log.error("Received error processing record={}", record, throwable);
}
如果您想终止通量并删除其余项目,只需执行以下操作

private void handleRecordError(Throwable throwable, Object record) {
    log.error("Received error processing record={}", record, throwable);
    throw throwable;
}

谢谢,它可以工作,但对我来说,它就像一个解决办法。@VasiliySarzhynskyi我同意,但我找不到任何适用于这个案例的API