RxJava:在HTTP请求期间创建一个Observable,在请求返回后继续运行

时间:2019-07-09 11:20:47

标签: java http asynchronous observable rx-java

我有一个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 个答案:

答案 0 :(得分:1)

我将使用Observable.fromCallable {},因为您只需要发出单个事件即可。那将处理onCompleate调用。从您分享的信息中,我不知道您如何正确处理一次性用品。您应该添加subscribeOn()和observeOn()运算符,它们将定义应在哪个线程上处理“工作”并应观察结果。

文档参考:

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