Переподключение с использованием retryWhen с двумя разными задержками

#java #redis #rx-java2

#java #redis #rx-java2

Вопрос:

Я хочу иметь два типа повторного соединения с разной задержкой (я использую Redis, работающий на Kubernetes и jedis clinet). Можно ли сделать это так и использовать retryWhen два раза в одном блоке? Если нет, то как это сделать? Модульные тесты предоставляют мне, что работает некорректно (я думаю, вызывается только первый retryWhen , а второй нет). Где ошибка?

 public Observable<String> getMessagesFromChannel(String channel) {
  return PublishSubject.<String>fromPublisher(
        subscriber ->
                config.executor().execute(() -> 
                bindRedisSubscriptionToPublisher(channel,subscriber)))
        .retryWhen(t -> t.take(config.numberOfReconnectWhenNetworkIsBreak()).delay(1, TimeUnit.SECONDS))
        .doOnError(ex -> 
    log.trace("Trying to subscribe "   config.numberOfReconnect()   " times without success"))
        .retryWhen(
        ts -> ts.doOnEach(
                ex -> {
                  log.warn(
                      "Redis instance down. Error while subscribing, trying to reconnect in {} ms",
                      config.reconnectTimeAfterRedisInstanceDown().toMillis(),
                      ex.getValue());
                })
       .delay(config.reconnectTimeAfterRedisInstanceDown().toMillis(), MILLISECONDS, config.scheduler()));
 }
  

Комментарии:

1. > Я хочу иметь два типа повторного подключения — не могли бы вы быть более конкретными? Пожалуйста, опишите на словах, как должна работать ваша стратегия повторных попыток.

2. хорошо, итак, из-за разрыва сетевого подключения я хочу повторить попытку 5 раз с задержкой в 1 секунду без какой-либо трассировки журнала, но если у меня все еще нет подключения к экземплярам redis, я хочу добавить предупреждение и повторить попытку еще раз с задержкой в 10 секунд, потому что я надеюсь, что это ситуация, когда Redis снова настраивается с помощьюkubernetes

3. Хорошо, я понял. Давайте посмотрим, что мы можем сделать