This example demonstrates how data from multiple resources and in various formats (json, xml) can be combined into a form suitable to ones requirements. The example show and compares usage of standard JAX-RS sync client, JAX-RS async client, Jersey's Observable (RxJava) client extension and Jersey's ListenableFuture (Guava) client extension.
The application consists of two parts:
org.glassfish.jersey.examples.rx.remote
package can be deployed on a
separate remote machine as every resource represents a service of it's own. DestinationResource
returns response entities as
JSON
while CalculationResource
and ForecastResource
as
XML
.
Every "agent" resource (package org.glassfish.jersey.examples.rx.agent
) invokes the
following requests to the "remote" resource:
The mapping of the URI path space is presented in the following table:
URI path | Resource class | HTTP methods | Allowed values |
---|---|---|---|
/rx/agent/sync |
SyncAgentResource | GET | returns JSON |
/rx/agent/async |
AsyncAgentResource | GET | returns JSON |
/rx/agent/observable |
ObservableAgentResource | GET | returns JSON |
/rx/agent/listenable |
ListenableFutureAgentResource | GET | returns JSON |
/rx/remote/destination/visited |
DestinationResource | GET | returns JSON |
/rx/remote/destination/recommended |
DestinationResource | GET | returns JSON |
/rx/remote/forecast/{destination} |
ForecastResource | GET | destination - name of a country; returns XML (random value) |
/rx/remote/calculation/from/{from}/to/{to} |
CalculationResource | GET | from - name of a country, to - name of a country; returns XML (random value) |
Application is Servlet 3 based, web.xml-less. Everything needed (resources/providers) is registered in
RxApplication
.
Agent responses look similar to the following one:
{ "visited" : [ { "destination" : "Antigua & Barbuda" }, { "destination" : "Guinea" }, { "destination" : "Malta" }, { "destination" : "Denmark" }, { "destination" : "Tajikistan" } ], "recommended" : [ { "destination" : "Bolivia", "forecast" : "Showers", "price" : 1359 }, { "destination" : "Yemen", "forecast" : "Haze", "price" : 8032 }, { "destination" : "Dominican Republic", "forecast" : "Cloudy", "price" : 1141 }, { "destination" : "Korea South", "forecast" : "Mostly Sunny", "price" : 9853 }, { "destination" : "Saudi Arabia", "forecast" : "Fog", "price" : 9063 } ], "processingTime" : 877 }As can be seen the response entity contains 3 main elements: visited (list of visited destinations), recommended (list of recommended destinations + weather forecast and price calculation) and processingTime (describing how long it took to obtain previous two elements).
Run the example as follows:
mvn clean package jetty:run
This deploys current example using Jetty. You can access the application at:
This examples is using the following (3-rd party) libraries: