diff --git a/.gitignore b/.gitignore
index 1890e8bd0e..a8f09b4135 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,3 +41,4 @@ SpringDataInjectionDemo/.mvn/wrapper/maven-wrapper.properties
spring-call-getters-using-reflection/.mvn/wrapper/maven-wrapper.properties
spring-check-if-a-property-is-null/.mvn/wrapper/maven-wrapper.properties
+/vertx-and-rxjava/.vertx/
diff --git a/pom.xml b/pom.xml
index da38d65df3..004e4b3df9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -240,6 +240,7 @@
spring-boot-property-exp
mockserver
undertow
+ vertx-and-rxjava
diff --git a/vertx-and-rxjava/pom.xml b/vertx-and-rxjava/pom.xml
new file mode 100644
index 0000000000..47510e60f7
--- /dev/null
+++ b/vertx-and-rxjava/pom.xml
@@ -0,0 +1,71 @@
+
+
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+ 4.0.0
+ com.baeldung
+ vertx-and-rxjava
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+
+ io.vertx
+ vertx-rx-java2
+ 3.5.0.Beta1
+
+
+ io.vertx
+ vertx-core
+ 3.5.0.Beta1
+
+
+ io.vertx
+ vertx-unit
+ 3.5.0.Beta1
+ test
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.25
+
+
+ ch.qos.logback
+ logback-classic
+ 1.2.3
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
\ No newline at end of file
diff --git a/vertx-and-rxjava/pom.xml.orig b/vertx-and-rxjava/pom.xml.orig
new file mode 100644
index 0000000000..47510e60f7
--- /dev/null
+++ b/vertx-and-rxjava/pom.xml.orig
@@ -0,0 +1,71 @@
+
+
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+ 4.0.0
+ com.baeldung
+ vertx-and-rxjava
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+
+ io.vertx
+ vertx-rx-java2
+ 3.5.0.Beta1
+
+
+ io.vertx
+ vertx-core
+ 3.5.0.Beta1
+
+
+ io.vertx
+ vertx-unit
+ 3.5.0.Beta1
+ test
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.25
+
+
+ ch.qos.logback
+ logback-classic
+ 1.2.3
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
\ No newline at end of file
diff --git a/vertx-and-rxjava/src/test/java/com/baeldung/CityAndDayLength.java b/vertx-and-rxjava/src/test/java/com/baeldung/CityAndDayLength.java
new file mode 100644
index 0000000000..dec4aa4852
--- /dev/null
+++ b/vertx-and-rxjava/src/test/java/com/baeldung/CityAndDayLength.java
@@ -0,0 +1,18 @@
+package com.baeldung;
+
+import java.text.MessageFormat;
+
+class CityAndDayLength {
+
+ private final String city;
+ private final double dayLengthInHours;
+
+ public CityAndDayLength(String city, long dayLengthInSeconds) {
+ this.city = city;
+ this.dayLengthInHours = dayLengthInSeconds / (60.0 * 60.0);
+ }
+
+ @Override public String toString() {
+ return MessageFormat.format("In {0} there are {1,number,#0.0} hours of light.", city, dayLengthInHours);
+ }
+}
diff --git a/vertx-and-rxjava/src/test/java/com/baeldung/MetaWeatherClient.java b/vertx-and-rxjava/src/test/java/com/baeldung/MetaWeatherClient.java
new file mode 100644
index 0000000000..0a3e9d8713
--- /dev/null
+++ b/vertx-and-rxjava/src/test/java/com/baeldung/MetaWeatherClient.java
@@ -0,0 +1,45 @@
+package com.baeldung;
+
+import io.reactivex.Flowable;
+import io.vertx.core.http.RequestOptions;
+import io.vertx.reactivex.core.http.HttpClient;
+import io.vertx.reactivex.core.http.HttpClientRequest;
+import io.vertx.reactivex.core.http.HttpClientResponse;
+
+import static java.lang.String.format;
+
+public class MetaWeatherClient {
+
+ private static RequestOptions metawether = new RequestOptions()
+ .setHost("www.metaweather.com")
+ .setPort(443)
+ .setSsl(true);
+
+ /**
+ * @return A flowable backed by vertx that automatically sends an HTTP request at soon as the first subscription is received.
+ */
+private static Flowable autoPerformingReq(HttpClient httpClient, String uri) {
+ HttpClientRequest req = httpClient.get(new RequestOptions(metawether).setURI(uri));
+ return req.toFlowable()
+ .doOnSubscribe(subscription -> req.end());
+}
+
+static Flowable searchByCityName(HttpClient httpClient, String cityName) {
+ HttpClientRequest req = httpClient.get(
+ new RequestOptions()
+ .setHost("www.metaweather.com")
+ .setPort(443)
+ .setSsl(true)
+ .setURI(format("/api/location/search/?query=%s", cityName)));
+ return req
+ .toFlowable()
+ .doOnSubscribe(subscription -> req.end());
+}
+
+ static Flowable getDataByPlaceId(HttpClient httpClient, long placeId) {
+ return autoPerformingReq(
+ httpClient,
+ format("/api/location/%s/", placeId));
+ }
+
+}
diff --git a/vertx-and-rxjava/src/test/java/com/baeldung/VertxWithRxJavaTest.java b/vertx-and-rxjava/src/test/java/com/baeldung/VertxWithRxJavaTest.java
new file mode 100644
index 0000000000..f02792c3d7
--- /dev/null
+++ b/vertx-and-rxjava/src/test/java/com/baeldung/VertxWithRxJavaTest.java
@@ -0,0 +1,94 @@
+package com.baeldung;
+
+import io.reactivex.Flowable;
+import io.vertx.reactivex.core.Vertx;
+import io.vertx.reactivex.core.buffer.Buffer;
+import io.vertx.reactivex.core.file.FileSystem;
+import io.vertx.reactivex.core.http.HttpClient;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.time.ZonedDateTime;
+
+import static com.baeldung.MetaWeatherClient.getDataByPlaceId;
+import static com.baeldung.MetaWeatherClient.searchByCityName;
+
+public class VertxWithRxJavaTest {
+
+ private Vertx vertx;
+ private HttpClient httpClient;
+ private FileSystem fileSystem;
+ static Logger log = LoggerFactory.getLogger(VertxWithRxJavaTest.class);
+
+ @Before public void setUp() {
+ vertx = io.vertx.reactivex.core.Vertx.vertx();
+ httpClient = vertx.createHttpClient();
+ fileSystem = vertx.fileSystem();
+ }
+
+ @After public void tearDown() {
+ vertx.close();
+ }
+
+ @Test public void lightLengthTest() throws InterruptedException {
+
+ // read the file that contains one city name per line
+ fileSystem
+ .rxReadFile("cities.txt").toFlowable()
+ .doOnNext(buffer -> log.info("File buffer ---\n{}\n---", buffer))
+
+ // split file content in lines to obtain one city per line
+ .flatMap(buffer -> Flowable.fromArray(buffer.toString().split("\\r?\\n")))
+ .doOnNext(city -> log.info("City from file: '{}'", city))
+
+ // discard cities that are commented out with a leading '#'
+ .filter(city -> !city.startsWith("#"))
+ .doOnNext(city -> log.info("City that survived filtering: '{}'", city))
+
+ // for each city sends a request to obtain its 'woeid'
+ // and collect the buffer from the answer
+ .flatMap(city -> searchByCityName(httpClient, city) )
+ .flatMap(response -> response.toFlowable())
+ .doOnNext(buffer -> log.info("JSON of city detail: '{}'", buffer))
+
+ // get the woeid of each city
+ .map(cityBuffer -> cityBuffer
+ .toJsonArray()
+ .getJsonObject(0)
+ .getLong("woeid"))
+
+ // use the id to ask for data
+ .flatMap(cityId -> getDataByPlaceId(httpClient, cityId))
+ .flatMap(response -> response
+ .toObservable()
+ .reduce(
+ Buffer.buffer(),
+ (total, newBuf) -> total.appendBuffer( newBuf )).toFlowable() )
+
+ // get the JSON object out of the response
+ .doOnNext(buffer -> log.info("JSON of place detail: '{}'", buffer))
+ .map(buffer -> buffer.toJsonObject())
+
+ // map the JSON in a POJO
+ .map(json -> {
+ ZonedDateTime sunRise = ZonedDateTime.parse(json.getString("sun_rise"));
+ ZonedDateTime sunSet = ZonedDateTime.parse(json.getString("sun_set"));
+ String cityName = json.getString("title");
+ return new CityAndDayLength(
+ cityName,sunSet.toEpochSecond() - sunRise.toEpochSecond());
+ })
+
+ // consume the events
+ .subscribe(
+ cityAndDayLength -> System.out.println(cityAndDayLength),
+ ex -> ex.printStackTrace());
+
+ // enough to give time to complete the execution
+ Thread.sleep(20000);
+
+ }
+
+}
diff --git a/vertx-and-rxjava/src/test/resources/cities.txt b/vertx-and-rxjava/src/test/resources/cities.txt
new file mode 100644
index 0000000000..dbe6e96758
--- /dev/null
+++ b/vertx-and-rxjava/src/test/resources/cities.txt
@@ -0,0 +1,6 @@
+Milan
+Chicago
+Cairo
+Santiago
+Moscow
+Auckland
\ No newline at end of file
diff --git a/vertx-and-rxjava/src/test/resources/logback-test.xml b/vertx-and-rxjava/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..71e05a4e24
--- /dev/null
+++ b/vertx-and-rxjava/src/test/resources/logback-test.xml
@@ -0,0 +1,12 @@
+
+
+
+ [%thread{32}] %-5level %msg - %logger%n
+
+
+
+
+
+
+
+
\ No newline at end of file