diff --git a/pom.xml b/pom.xml
index 06feb5e4f5..41235dcc26 100644
--- a/pom.xml
+++ b/pom.xml
@@ -94,6 +94,7 @@
rest-assured
rest-testing
resteasy
+ rxjava
selenium-junit-testng
solr-fulltext-search
diff --git a/rxjava/pom.xml b/rxjava/pom.xml
new file mode 100644
index 0000000000..63aa1f127e
--- /dev/null
+++ b/rxjava/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ rxjava
+ 1.0-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+ io.reactivex
+ rxjava
+ ${rx.java.version}
+
+
+
+
+ 1.2.5
+
+
+
\ No newline at end of file
diff --git a/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java b/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java
new file mode 100644
index 0000000000..9855123a3b
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/ColdObservableBackpressure.java
@@ -0,0 +1,38 @@
+package com.baelding.rxjava;
+
+import rx.Observable;
+import rx.schedulers.Schedulers;
+
+public class ColdObservableBackpressure {
+ public static void main(String[] args) throws InterruptedException {
+ Observable.range(1, 1_000_000).observeOn(Schedulers.computation()).subscribe(v -> ComputeFunction.compute(v), Throwable::printStackTrace);
+
+ Thread.sleep(10_000);
+
+ // Observable.range(1, 1_000_000) //implementation of reactive pull backpressure on cold observable
+ // .subscribe(new Subscriber() {
+ // @Override
+ // public void onStart() {
+ // request(1);
+ // }
+ //
+ // public void onNext(Integer v) {
+ // compute(v);
+ //
+ // request(1);
+ // }
+ //
+ // @Override
+ // public void onError(Throwable ex) {
+ // ex.printStackTrace();
+ // }
+ //
+ // @Override
+ // public void onCompleted() {
+ // System.out.println("Done!");
+ // }
+ // });
+
+ }
+
+}
diff --git a/rxjava/src/main/java/com/baelding/rxjava/ComputeFunction.java b/rxjava/src/main/java/com/baelding/rxjava/ComputeFunction.java
new file mode 100644
index 0000000000..924862ab37
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/ComputeFunction.java
@@ -0,0 +1,43 @@
+package com.baelding.rxjava;
+
+import rx.Observable;
+
+import java.util.List;
+
+public class ComputeFunction {
+ public static void compute(Integer v) {
+ try {
+ System.out.println("compute integer v: " + v);
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void compute(List v) {
+ try {
+ System.out.println("compute integer v: " + v);
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void compute(Observable v) {
+ try {
+ v.forEach(System.out::println);
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void compute(Long v) {
+ try {
+ System.out.println("compute integer v: " + v);
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBatching.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBatching.java
new file mode 100644
index 0000000000..6acda7eaad
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBatching.java
@@ -0,0 +1,18 @@
+package com.baelding.rxjava;
+
+import rx.schedulers.Schedulers;
+import rx.subjects.PublishSubject;
+
+public class HotObservableBackpressureBatching {
+ public static void main(String[] args) throws InterruptedException {
+ PublishSubject source = PublishSubject.create();
+
+ source.window(500).observeOn(Schedulers.computation()).subscribe(ComputeFunction::compute, Throwable::printStackTrace);
+
+ for (int i = 0; i < 1_000_000; i++) {
+ source.onNext(i);
+ }
+ Thread.sleep(10_000);
+ }
+
+}
diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBuffering.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBuffering.java
new file mode 100644
index 0000000000..50638f4c8a
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureBuffering.java
@@ -0,0 +1,17 @@
+package com.baelding.rxjava;
+
+import rx.schedulers.Schedulers;
+import rx.subjects.PublishSubject;
+
+public class HotObservableBackpressureBuffering {
+ public static void main(String[] args) throws InterruptedException {
+ PublishSubject source = PublishSubject.create();
+
+ source.buffer(1024).observeOn(Schedulers.computation()).subscribe(ComputeFunction::compute, Throwable::printStackTrace);
+
+ for (int i = 0; i < 1_000_000; i++) {
+ source.onNext(i);
+ }
+ Thread.sleep(10_000);
+ }
+}
diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureSkipping.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureSkipping.java
new file mode 100644
index 0000000000..f6f8b9f563
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableBackpressureSkipping.java
@@ -0,0 +1,21 @@
+package com.baelding.rxjava;
+
+import rx.schedulers.Schedulers;
+import rx.subjects.PublishSubject;
+
+import java.util.concurrent.TimeUnit;
+
+public class HotObservableBackpressureSkipping {
+ public static void main(String[] args) throws InterruptedException {
+ PublishSubject source = PublishSubject.create();
+
+ source.sample(100, TimeUnit.MILLISECONDS)
+ // .throttleFirst(100, TimeUnit.MILLISECONDS)
+ .observeOn(Schedulers.computation()).subscribe(ComputeFunction::compute, Throwable::printStackTrace);
+
+ for (int i = 0; i < 1_000_000; i++) {
+ source.onNext(i);
+ }
+ Thread.sleep(10_000);
+ }
+}
diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackpressure.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackpressure.java
new file mode 100644
index 0000000000..afef8027bf
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableOnBackpressure.java
@@ -0,0 +1,18 @@
+package com.baelding.rxjava;
+
+import rx.BackpressureOverflow;
+import rx.Observable;
+import rx.schedulers.Schedulers;
+
+public class HotObservableOnBackpressure {
+ public static void main(String[] args) throws InterruptedException {
+ Observable.range(1, 1_000_000).onBackpressureBuffer(16, () -> {
+ }, BackpressureOverflow.ON_OVERFLOW_DROP_OLDEST).observeOn(Schedulers.computation()).subscribe(e -> {
+ }, Throwable::printStackTrace);
+
+ Observable.range(1, 1_000_000).onBackpressureDrop().observeOn(Schedulers.io()).doOnNext(ComputeFunction::compute).subscribe(v -> {
+ }, Throwable::printStackTrace);
+ Thread.sleep(10_000);
+
+ }
+}
diff --git a/rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackpressure.java b/rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackpressure.java
new file mode 100644
index 0000000000..7745dbe5c4
--- /dev/null
+++ b/rxjava/src/main/java/com/baelding/rxjava/HotObservableWithoutBackpressure.java
@@ -0,0 +1,20 @@
+package com.baelding.rxjava;
+
+
+import rx.schedulers.Schedulers;
+import rx.subjects.PublishSubject;
+
+public class HotObservableWithoutBackpressure {
+ public static void main(String[] args) throws InterruptedException {
+ PublishSubject source = PublishSubject.create();
+
+ source.observeOn(Schedulers.computation())
+ .subscribe(ComputeFunction::compute, Throwable::printStackTrace);
+
+
+ for (int i = 0; i < 1_000_000; i++) {
+ source.onNext(i);
+ }
+ Thread.sleep(10_000);
+ }
+}