RxJava: создайте наблюдаемый во время HTTP-запроса, который продолжает работать после возврата запроса - PullRequest
0 голосов
/ 09 июля 2019

У меня есть HTTP-запрос, который запускает долго выполняющуюся задачу (несколько HTTP-запросов к другой службе), которая должна выполняться в фоновом режиме, пока исходные запросы завершаются.

Так что я делаю

public void triggerWork(@RequestBody SomeObject somObject) {
    return new ResponseEntity<>(startWorkAndReturn(somObject), HttpStatus.OK);
  }

public void startWorkAndReturn(SomeObject someObject) {
    Observable.create(observableEmitter -> {
      // do the work with someObject here and at some time call
      observableEmitter.onNext("result");
    }).subscribe(new Observer<Object>() {
      @Override
      public void onSubscribe(Disposable disposable) {

      }

      @Override
      public void onNext(Object o) {
        // called at some unknown time
      }

      @Override
      public void onError(Throwable throwable) {

      }

      @Override
      public void onComplete() {
        // currently not used as all the work is done in onNext but maybe that's a mistake
      }
    });
    return;
  }

Но это, кажется, блокирует запрос, пока вся работа не будет выполнена.Что уже кажется мне странным, поскольку я никогда не вызываю onComplete, что само по себе может быть ошибкой.Но все же мне интересно, как создать запрос, который сразу же возвращается после запуска фонового рабочего.

Является ли Flowables решением здесь?Я собираюсь реорганизовать их в любом случае, чтобы справиться с противодавлением.Или мне нужно создать фоновый рабочий поток?Какова лучшая практика здесь?

Спасибо

1 Ответ

1 голос
/ 09 июля 2019

Я бы использовал Observable.fromCallable {}, так как вам нужно генерировать только одно событие.Это будет обрабатывать вызов onCompleate.Из информации, которой вы делитесь, я не знаю, как вы можете правильно обращаться с одноразовыми.Вы должны добавить операторы subscribeOn () и наблюдаем (), которые будут определять, в каком потоке должна обрабатываться «работа» и должен наблюдаться результат.

Документы ссылки:

http://reactivex.io/RxJava/javadoc/io/reactivex/Observable.html#fromCallable-java.util.concurrent.Callable-

http://reactivex.io/documentation/operators/subscribeon.html

http://reactivex.io/documentation/operators/observeon.html

...