Multithreading RXJava调度程序和异步回调api
在我们的项目中,我们将RXJava与CXF异步(2个Rest服务+1个Soap服务)和Mongodb异步驱动程序一起使用Multithreading RXJava调度程序和异步回调api,multithreading,asynchronous,rx-java,Multithreading,Asynchronous,Rx Java,在我们的项目中,我们将RXJava与CXF异步(2个Rest服务+1个Soap服务)和Mongodb异步驱动程序一起使用 public Observable<MyReturn> itineraries(MyQuery query) { return Observable.create((Observable.OnSubscribe<MyReturn>) subscriber -> { WebC
public Observable<MyReturn> itineraries(MyQuery query) {
return Observable.create((Observable.OnSubscribe<MyReturn>) subscriber -> {
WebClient webclient = WebClient.fromClient(clientPrototype(), true);
String myQuery = "" ;
webclient.path("myPath",....);
webclient.get(new InvocationCallback<MyClass>() {
@Override
public void completed(MyClass response) {
MyReturn myReturn = buildResponse(response);
subscriber.onNext(myReturn);
subscriber.onCompleted();
}
@Override
public void failed(Throwable throwable) {
subscriber.onError(new MyError(throwable));
}
});
});
公众可观察行程(MyQuery){
返回可观察的。创建((可观察的。OnSubscribe)订户->{
WebClient WebClient=WebClient.fromClient(clientPrototype(),true);
字符串myQuery=“”;
webclient.path(“myPath”、…);
webclient.get(新调用回调(){
@凌驾
公共作废已完成(MyClass响应){
MyReturn MyReturn=buildResponse(响应);
订户.onNext(myReturn);
subscriber.onCompleted();
}
@凌驾
公共作废失败(可丢弃可丢弃){
订户.onError(新MyError(可丢弃));
}
});
});
我有一个链式观察对象,我的问题是我的代码是由CXF线程池执行的(我使用一个自定义线程池),而所有其他链式观察对象都是在同一个callaback CXF线程中执行的。因此,我的处理从回调线程转到下一个回调线程
我尝试使用“observerOn”提供我自己的线程池,但它不起作用,代码在回调线程中执行
对于CXF,我可以通过我自己的池,因此这是一个设计问题。但是对于mongodb,我不能通过我的线程池(我没有找到一种方法来通过它),我有一个随机的安全权限问题,即使我允许激活security manager的所有操作
谢谢。您是如何应用<代码>observeOn?行程中的订户(…).observeOn(Schedulers.computation()).subscribe(…)应该在计算线程上收到值。@akanokd感谢您的回答。行程().flatMap(…).map(…)(RX Observables操作符链)…observeOn(Schedulers.from(myPool)).subscribe()。接收线程没有问题,我在正确的线程中接收流。但是中间计算(在调用CXF或Mongo和最终订阅之间)在CXF或Mongodb线程中执行。然后将
observeOn
放在行程()之后呼叫。谢谢,当我将observeOn添加到由行程返回的observeOn上时,它会起作用。因此,observeOn不会应用于所有observeOn链?我必须将它放在每个observeOn上,在我需要其他调度程序的位置?observeOn
会影响链中紧随其后的操作符。如果您想在管道的不同点,您必须在这些点应用observeOn
。您如何应用observeOn
?行程中的订阅者(…)。observeOn(Schedulers.computation()).subscribe(…)应该收到计算线程上的值。@akanokd感谢您的回答。行程().flatMap(…).map(…)。。(RX Observables operators chains)…observeOn(Schedulers.from(myPool)).subscribe()。接收线程没有问题,我在正确的线程中接收流。但是中间计算(在调用CXF或Mongo和最终订阅之间)在CXF或Mongodb线程中执行。然后将observeOn
放在行程()之后呼叫。谢谢,当我将observeOn添加到由行程返回的observeOn上时,它会起作用。因此,observeOn不会应用于所有observeOn链?我必须将它放在每个observeOn上,在我需要其他调度程序的位置?observeOn
会影响链中紧随其后的操作符。如果您想在管道的不同点,必须在这些点应用observeOn
。