反应堆,如何调试OverflowException?

时间:2018-10-09 10:30:22

标签: java project-reactor reactor

我试图找到一种方法来理解/调试为什么我随机拥有该stacktrace:

reactor.core.Exceptions$OverflowException: Could not emit buffer due to lack of requests
at reactor.core.Exceptions.failWithOverflow(Exceptions.java:215)
at reactor.core.publisher.FluxBufferPredicate$BufferPredicateSubscriber.emit(FluxBufferPredicate.java:292)
at reactor.core.publisher.FluxBufferPredicate$BufferPredicateSubscriber.onNextNewBuffer(FluxBufferPredicate.java:251)
at reactor.core.publisher.FluxBufferPredicate$BufferPredicateSubscriber.tryOnNext(FluxBufferPredicate.java:205)
at reactor.core.publisher.FluxBufferPredicate$BufferPredicateSubscriber.onNext(FluxBufferPredicate.java:180)
at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onNext(FluxMap.java:201)
at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.innerNext(FluxConcatMap.java:271)
at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:803)
at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:232)
at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:190)
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:1444)
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:1318)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:128)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:61)
at reactor.core.publisher.Flux.subscribe(Flux.java:6873)

这是否意味着生产者比消费者快?我的模式可能不是标准的,看起来像下面的样子(在这里简化):

Flux<Pair<Person, String>> auto = getPersons() // REST GET endpoint
        .map(p -> {
            // In my real-life example, the operation done here is quiet expensive.
            Person newP = new Person(p.name, p.age + 10);
            return new Pair<>(newP, "The new age of " + newP.name + " is now " + newP.age);
        })
        .publish()
        .autoConnect(2);

    Flux<Person> personsToSave = auto.map(e -> e.first);
    Flux<String> auditToSave = auto.map(e -> e.second);

    Mono.when(
            savePersons(personsToSave), // REST POST endpoint
            saveAudit(auditToSave))     // REST POST endpoint
        .doOnError(e -> System.err.println(e.getMessage()))
        .block();

Hooks.onOperatorDebug()或log()对我没有太大帮助。如果删除publish()并仅保存人员或审核,我不会有问题。

有人可以给我如何进行更精确的调查吗? (或解决问题的想法) 反应堆3.1.6

0 个答案:

没有答案