Shotoku renewable cache

The renewable cache is designed to fit one use case: when you need to store some data in a cache, and update it periodically in the background. For example, imagine you have a large configuration file, which determines the layout of your web page. You have to:

  • on every web page request, read the parsed configuration data, and
  • from time to time, update the configuration data, basing on persistent store (filesystem, database, etc ...).
Of course, making the updates a blocking operation on a web page request isn't acceptable. That is where you can use Shotoku Renewable Cache, which will update the values held in cache in the background, on regular intervals of time.

As the backing cache, a JBoss Cache tree cache is used (any configured by the user). The renewable cache operates on units called "cache items". Each cache item is bound with one FQN in the associated tree cache. A cache item then creates and stores objects in tree cache keys (attributes).

To create a cache item, you have to implement an interface CacheItemDataSource, which has two functions:

  • init(key) - this is called when a value for a key is requested for the first time. The task of this function is to return an initial value. It is the only blocking operation.
  • update(key, currentValue) - this is called when a key is updated. The current value is supplied, and the function may return either a new value, or keep the old value in the cache. This operation is performed by a daemon thread, on specified intervals of time.

Then you just need to register you cache item datasource, and you can read data from it, using a simple get(key) function. To see an example of a cache item and it's usage, click here.

Shotoku Renewable Cache also comes with an administration panel, which lets you change the configuration (for example update intervals) and monitor the state of the updates (when keys where last updated). Thanks to Ajax4JSF, you don't have to refresh the panel to check if anything has changed: all important parts are refreshed automatically.

Also, in the administration console you can see alerts when:

  • a key isn't updated for too long
  • a key is in update for too long (if this is the case, you can reset the key's update status, so that the service tries to update it again)
  • an exception occurred during a key update (the exception will also be logged in the AS log, but only once, and if subsequent updates throw exceptions again, they will be suppressed, until the original alert is "cleared" in the administration console. This way your log will stay relatively clean.)
For all of these alerts, you can configure e-mail notifications. For example, if you get an alert that a key is not updated for too long, it may mean that the interval of updates is too short, that there are not enough update threads or, if the data is read from a remote host, that the host is down.

Check also:

One of the places where the renewable cache is used, is in the software running this site. It was developed as a support project for JBoss Labs, which works on JBoss Portal.

Shotoku Renewable Cache works with JBoss AS 4.0.x and JBoss Cache 1.4.x.

Here's how the administration panel looks:

JBoss Blog Portlet

Envers in Anvers!
Posted on Dec 4, 2008 1:29:22 PM by Adam Warski.

December came, so it’s time for Devoxx! (formerly JavaPolis) If you are planning to visit Antwerp this year, make sure to come and see the Envers presentation (first conference day, 3pm)! I will expla...

Typestate checker - introduction
Posted on Nov 17, 2008 1:17:29 PM by Adam Warski.

When dealing with mutable objects in Java, we quite often see that “states” of the class considered emerge. The (abstract) “state” depends of course on the content of the fields of the object. When me...

Envers moves to Hibernate!
Posted on Oct 30, 2008 7:08:13 AM by Adam Warski.

I’m happy to announce that Envers is now a module of Hibernate! This means that: the code is now in the hibernate-core repository (envers module). There will be no more commits to the old repository. ...

Adding structure to Seam events
Posted on Oct 23, 2008 9:19:07 AM by Adam Warski.

The idea described here is originally by Tomek Szymański. I just enhanced it a little. Seam events are a very convenient tool to divide your business logic into smaller pieces, and add some new behavi...

Envers 1.1.0.GA released
Posted on Oct 21, 2008 2:29:18 PM by Adam Warski.

Today Envers 1.1.0.GA has been released. For the impatient: go straight to the downloads! :) This release contains only minor modifications from the last beta version. You can see the release notes fo...

Envers on JDD 08
Posted on Oct 14, 2008 3:51:39 AM by Adam Warski.

If you’ll be visting Java Developers’ Day 2008 in Cracow, Poland on Thursday, be sure to stop by and see my presentation of Envers. It will be an introductory talk, in Polish; I’ll post the slides on ...

Envers 1.1.0.beta2 released with collections support
Posted on Sep 27, 2008 4:44:29 AM by Adam Warski.

Today Envers 1.1.0.beta2 has been released. This release focuses on supporting persistent collections. In earlier versions, it was only possible to version collections belonging to one-to-many bidirec...

Envers on Herbstcampus 2008
Posted on Sep 19, 2008 12:04:02 PM by Adam Warski.

Yesterday I came back from Herbstcampus 2008 in Nürnberg. I gave there a talk on Envers. Thanks to all who attended! I’d also like to thank the organisers, everything went smoothly and I felt really w...

Envers is back from vacations
Posted on Sep 3, 2008 5:58:52 AM by Adam Warski.

Hello, after a vacation break, Envers is back with a 1.1.0.beta1 release. You can find the release notes here . There’s quite a lot of changes and improvements in this release. Firstly, Envers now onl...

Envers 1.0.0.GA released!
Posted on Jul 16, 2008 6:51:30 AM by Adam Warski.

Today the first general availability version of Envers has been released (downloads, release notes). This is a stable version containig all the features found in the preview and beta versions. It does...