我有一个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解决方案吗?无论如何,我将重构那些以处理背压。还是我需要创建一个后台工作线程?最佳做法是什么?
谢谢
答案 0 :(得分:1)
我将使用Observable.fromCallable {},因为您只需要发出单个事件即可。那将处理onCompleate调用。从您分享的信息中,我不知道您如何正确处理一次性用品。您应该添加subscribeOn()和observeOn()运算符,它们将定义应在哪个线程上处理“工作”并应观察结果。
文档参考:
http://reactivex.io/documentation/operators/subscribeon.html