Удалите несколько подписок и сохраните их в одном потоке

#java #rx-java

#java #rx-java

Вопрос:

У меня есть следующий метод, который работает, как и ожидалось.

Но есть ли способ, которым я мог бы изменить его, чтобы мне не приходилось подписываться на вызов webclient отдельно

и вместо этого позволить ему быть частью потока и подписаться на него только один раз от какого-либо подписчика?

Обратите внимание, что в конечном итоге это должно возвращать наблюдаемое <целое число> .

 Observable<Integer> observable = Observable.just(1)
        .delay(5, TimeUnit.MILLISECONDS)
        .compose(obs -> {
            webClient.putAbs("url")
                    .rxSend()
                    .doOnSubscribe(() -> System.out.println("Subbing to client")) // to be removed with solution
                    .subscribe(); // I don't want to have to do a sub here. 
            return obs;
        })
        .doOnSubscribe(() -> System.out.println("the only single sub i want to have"));
  

Какой-нибудь внешний подписчик сделает следующее.

observable.subscribe() ;

Я бы хотел, чтобы это запускало общий поток, который также вызывал бы вызов webclient вместо отдельного вызова, как указано выше.

Возможно ли это?

Таким образом, ищите что-то вроде следующего, которое не подписывается на WebClient отдельно.

Пробовал через flatmap и compose и не смог этого достичь.

(Следующее синтаксически неверно. Это просто для того, чтобы примерно показать, что я ищу).

 Observable<Integer> observable = Observable.just(1)
        .delay(5, TimeUnit.MILLISECONDS)
        .compose(obs -> webClient.putAbs(""))
        .rxSend()
        .toObservable();
  

Ценю любые рекомендации. Спасибо.

Ответ №1:

Это должно сработать:

 Observable<Integer> observable = Observable.just(1)
            .delay(5, TimeUnit.MILLISECONDS)
            .flatMap(obs -> webClient.putAbs("url").rxSend().map(a -> obs));
  

.flatMap() охотно подписывается на внутренний webClient вызов.