#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. Хорошо, я понял. Давайте посмотрим, что мы можем сделать