排队独立的Observables

时间:2015-04-30 17:09:45

标签: java rx-java

是否可以对多个可观察对象进行排队,以便他们在彼此之后重新执行,而不是彼此了解?

假设我在3个不同的类和/或线程中有3个不同的Observable。他们都代表了不同的要求。它们何时执行的顺序取决于哪个观察者有第一个订户(我们不知道)

我想要的是,它们是在某种队列中彼此之后执行的,如果第四个observable正在加入队列,则应将其添加到队列中并在第3个队列之后执行。

是否可以使用一些ootb rx工具?

2 个答案:

答案 0 :(得分:0)

根据我对您的问题的理解,您希望构建Observable Observable。然后使用concatMap

按顺序执行Observable
Observable<Observable<Result>> tasks = ... //build your Observable of Observable

tasks.concatMap(obs -> obs)
     .subscribe(resultOfNestedObservable -> /** getting result of Observable **/);

要测试这个想法,请尝试使用Subject

 Subject<Observable<Observable<Result>> source = PublishSubject.create(); 
 Observable<Observable<Result>> tasks = source;

 /*...*/
 source.onNext(observable1);
 source.onNext(observable2);

答案 1 :(得分:0)

如果我理解正确的问题,你有独立的观察者和独立的订阅者,但你仍然想确保只有一个observable正在“执行”。这可以通过自定义调度程序实现:

ExecutorService exec = Executors.newFixedThreadPool(1, r -> {
    Thread t = new Thread(r);
    t.setDaemon(true);
    return t;
});
Scheduler singleThread = Schedulers.from(exec);

Observable o1 = someObservable.subscribeOn(singleThread);
Observable o2 = someObservable.subscribeOn(singleThread);
Observable o3 = someObservable.subscribeOn(singleThread);

o2.subscribe();
o1.subscribe();
o3.subscribe();

ExecutorService有自己的队列,无论谁先订阅,其他人都将保留在队列中,直到前一个队列完成。