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:

        
          cache.put(location, weather, 5, TimeUnit.SECONDS);
        
      

With this in mind let's run our application again:

        
          git checkout -f step-3
          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 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.