Tutorials The Weather App

The Weather App

Typical applications store in the cache data that is the result of an expensive computation or has been retrieved from a slower data-source (e.g. a database or a webservice). If such data is immutable (or mostly immutable), such as names of cities, types of product, etc, it makes sense to store it such as if the data needs to be periodically regenerated/re-retrieved, it is desirable to set an expiration time, thus making the cache entries mortal. In Infinispan entry expiration can happen in two ways:

  • a certain time after the data was inserted into the cache (i.e. lifespan)
  • a certain time after the data was last accessed (i.e. maximum idle time)
The Cache interface offers overloaded versions of the put() method that allow specifying either or both expiration properties. The following example shows how to insert an entry which will expire after 5 seconds:
        
          = preserve do
            :escaped
              cache.put(location, weather, 5, TimeUnit.SECONDS);
        
      
With this in mind let's run our application again:
        
          = preserve do
            :escaped
              $ git checkout -f step-3
              $ mvn clean package exec:exec
        
      
Output
            
              = preserve do
                :escaped
                  ---- 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 1205ms ----
                  ---- 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 2ms ----
                  ---- 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 1048ms ----
            
          

To show how expiration works, we've added a 5-second sleep time and we print out the weather conditions a third time. As you can see the timing of the third run is in the same order of magnitude as the first (uncached) run: all of our entries have expired. In Infinispan expiration is verified lazily, i.e. if an attempt to retrieve an expired entry is made, that entry will be removed from the cache. It is also possible to enable pro-active removal using eviction.

Since we want all of the entries in the cache to expire by default, we can configure the cache to do so without using a special put() method invocation. This will be explained in the next step.