Tutorial Steps
Introduction- The Weather Application
- Initializing the CacheManager
- Putting stuff in the cache
- Making entries expire
- Configuring the cache
- Clustering the application
- Listen to changes in the cluster
- Listen to changes in the cache
- Grouping entries together
- Temperature averages with streams
- Declarative configuration
The Weather App
With a CacheManager running we can start creating caches and storing data in them. Caches in Infinispan are "named" which means they are identified by a unique name. We are going to enhance the WeatherService implementations from our initial version so that they store the retrieved data in a cache. To do this we will create an intermediate abstract class between the WeatherService interface and the concrete implementations: the CachingWeatherService. This class wraps the expensive remote calls in a method which caches the result returned by the remote call and, before subsequent invocations, checks whether the data is already available locally instead of invoking the expensive remote API. First of all let's obtain our cache:
cacheManager.defineConfiguration("weather", new ConfigurationBuilder().build());
Cache<String, LocationWeather> cache = cacheManager.getCache("weather");
We are defining a named cache "weather" using a default configuration, which means a basic local cache. As you can see, the generic types of the keys and values are inferred from the assignment type. Next up, let's see the caching wrapper for the weather retrieval:
LocationWeather weather = cache.get(location);
if (weather == null) {
weather = fetchWeather(location);
cache.put(location, weather);
}
return weather;
Since an Infinispan Cache is an implementation of the java.util.Map interface, the above code should be self explanatory. With the caching in place, let's run the application again, using the usual:
git checkout -f step-2
mvn clean package exec:exec
Output
---- Fetching weather information ----
Rome, Italy - Temperature: 12.9° C, Conditions: light rain
Como, Italy - Temperature: 6.3° C, Conditions: Sky is Clear
Basel, Switzerland - Temperature: 0.8° C, Conditions: overcast clouds
Bern, Switzerland - Temperature: -1.6° C, Conditions: broken clouds
London, UK - Temperature: 1.8° C, Conditions: light rain
Newcastle, UK - Temperature: 2.6° C, Conditions: scattered clouds
Bucharest, Romania - Temperature: 9.3° C, Conditions: scattered clouds
Cluj-Napoca, Romania - Temperature: 6.4° C, Conditions: scattered clouds
Ottawa, Canada - Temperature: -7.0° C, Conditions: overcast clouds
Toronto, Canada - Temperature: -7.0° C, Conditions: broken clouds
Lisbon, Portugal - Temperature: 14.6° C, Conditions: overcast clouds
Porto, Portugal - Temperature: 12.2° C, Conditions: moderate rain
Raleigh, USA - Temperature: 3.9° C, Conditions: Sky is Clear
Washington, USA - Temperature: 3.4° C, Conditions: light rain
---- Fetched in 1634ms ----
---- Fetching weather information ----
Rome, Italy - Temperature: 12.9° C, Conditions: light rain
Como, Italy - Temperature: 6.3° C, Conditions: Sky is Clear
Basel, Switzerland - Temperature: 0.8° C, Conditions: overcast clouds
Bern, Switzerland - Temperature: -1.6° C, Conditions: broken clouds
London, UK - Temperature: 1.8° C, Conditions: light rain
Newcastle, UK - Temperature: 2.6° C, Conditions: scattered clouds
Bucharest, Romania - Temperature: 9.3° C, Conditions: scattered clouds
Cluj-Napoca, Romania - Temperature: 6.4° C, Conditions: scattered clouds
Ottawa, Canada - Temperature: -7.0° C, Conditions: overcast clouds
Toronto, Canada - Temperature: -7.0° C, Conditions: broken clouds
Lisbon, Portugal - Temperature: 14.6° C, Conditions: overcast clouds
Porto, Portugal - Temperature: 12.2° C, Conditions: moderate rain
Raleigh, USA - Temperature: 3.9° C, Conditions: Sky is Clear
---- Fetched in 2ms ----
You should see the weather conditions displayed twice, but the second run should be several orders of magnitude faster. Good stuff! Entries created above are immortal, i.e. they will exist in the cache until removed. In the next step we will see how to add mortal entries.