Почему Mono.doOnError печатает журналы ошибок

У меня есть функция для хранения данных в массиве диванов. Я использую реактивную коллекцию в Couchbase 3.0 SDK.

В приведенном ниже примере я могу хранить данные, но в журналах печатается CasMismatchException. Но поскольку это ожидаемо, я не хочу, чтобы его печатали, как я могу этого добиться?

private Consumer<? super Throwable> upsert(String key, String value) {
    return e -> {
      if (e instanceof CasMismatchException || e instanceof DocumentExistsException) {

            defaultCollection // couchbase reactive default colection
            .get(key)
            .subscribe(
                s -> {
                  List<String> values = new ArrayList<>();
                  values.addAll(s.contentAs(ArrayList.class));
                    values.add(value);
                    defaultCollection
                        .replace(key, values, ReplaceOptions.replaceOptions().cas(s.cas()))
                        .doOnError(upsert(key,value))
                        .subscribe();
                });
      } else {
        LOGGER.error("Error on couch operation on - {}", e);
      }
    };
  }

Этот код печатает журналы ошибок, можно ли этого избежать?


person Arun Xavier    schedule 08.06.2021    source источник
comment
вы подписываетесь как побочный эффект И внутри подписки. это огромный запах реактивного кода, поскольку вы разрываете реактивную цепочку, поэтому операторы не могут правильно реагировать на ошибки или отмену. попытайтесь лучше составить свою цепочку, используя операторы обработки ошибок, такие как, например, onErrorResume.   -  person Simon Baslé    schedule 09.06.2021
comment
@SimonBaslé, я использовал onErrorResume, он изящно обрабатывает ошибку, но когда я выполняю нагрузочный тест (около 1000 параллельных вызовов), я получаю исключение java.util.concurrent.CompletionException, и данные теряются.   -  person Arun Xavier    schedule 09.06.2021
comment
Я использую Hooks.onErrorDropped, как предложено в stackoverflow.com/a/60145492/4290096, похоже, я могу контролировать журналы ошибок   -  person Arun Xavier    schedule 09.06.2021


Ответы (1)


Я решил повторяющуюся печать ошибок с помощью Hooks.onErrorDropped.

 Hooks.onErrorDropped(error -> {
            logger.log(Level.WARNING, "Exception happened:", error);
        });

Но, как было предложено в комментариях, вы также можете использовать onErrorResume. Я использовал onErrorDropped для своего конкретного случая. Более подробные пояснения можно найти по ссылкам ниже.

person Arun Xavier    schedule 11.06.2021