package com.github.benjchristensen.gist;
import java.util.concurrent.atomic.AtomicInteger;
import rx.Observable;
import rx.schedulers.Schedulers;
/**
* Example of using Observable.publish, observeOn and zip demonstrating backpressure
*/
public class RxJavaPublishZip {
public static void main(String[] args) throws Exception{
final AtomicInteger numEmitted = new AtomicInteger();
Observable<String> strings = Observable.range(1, 1000000).doOnNext(i -> numEmitted.incrementAndGet())
.publish(oi -> {
// schedule it so we are async and need backpressure
Observable<String> odd = oi.observeOn(Schedulers.computation())
.filter(i -> i % 2 != 0).map(i -> i + "-odd").map(s -> {
// make odd slow
try {
Thread.sleep(1);
} catch (Exception e1) {
}
return s;
});
Observable<String> even = oi.observeOn(Schedulers.computation())
.filter(i -> i % 2 == 0).map(i -> i + "-even");
return Observable.zip(odd, even, (o, e) -> o + " " + e + " Thread: " + Thread.currentThread());
}).take(2000);
strings.toBlocking().forEach(System.out::println);
System.out.println("Number emitted from source (should be ~4000): " + numEmitted.get());
}
}