Как переключиться на нового издателя, если предыдущий вышел из строя или сломался? - PullRequest
0 голосов
/ 16 июня 2020

Предположим, что существует три объекта:

  • Supplier of Mono<ValuesSource> - поставщик ValuesSource издателей
  • ValuesSource - издатель ценностей
  • значение (их природа не важна, т.е. String)

Намерение:

  1. взять следующий источник от поставщика
  2. создать издатель, извлекающий значения из источника
  3. для каждого ответа вернуть текущие значения-издатель
  4. если текущий источник не может создать следующее значение (выдает ошибку или возвращает Mono.error) go к шагу (1)

Как правильно переключиться на новый ValuesSource, если предыдущий отказал?


class ValuesService {

  private ValuesSource source;
  private Mono<String> valuesPublisher;

  NumbersGeneratorServiceImpl(Supplier<Mono<ValuesSource>> sourcesSupplier) {
    var currentSource = sourcesSupplier.get();
    this.valuesPublisher= Mono.defer(() -> source.flatMap(s -> s.makeNextValue()));                        
  }

  @Override
  public Mono<Object> nextValue() {
    // how to detect if publisher failed to publish a value
    // and create a new publisher with new source from sourcesSupplier.get()
    return valuesPublisher;
  }
}

1 Ответ

1 голос
/ 16 июня 2020

Трудно сказать, что именно вы хотите сделать, но если я правильно понимаю и вы хотите получить от поставщика, вы можете просто использовать

Mono # retry

ValueSource заменен на String, поскольку из вопроса неясно, что вы хотите с ним делать, но это не влияет на logi c в любом случае.

class ValuesService{

    private Mono<String> valuesPublisher;

    ValuesService(Supplier<Mono<String>> sourcesSupplier) {

        this.valuesPublisher =
                //Every subscription calls get on supplier
                Mono.defer(sourcesSupplier)
                        //Retry when error, resubsribes each time
                        .retry();
    }

    Mono<String> getValuesPublisher(){
        return valuesPublisher;

    }
}
...