||
Skip to end of metadata
Go to start of metadata

WSO2 Carbon 4.4.x Kernel allows users to have 6 Cache entry listeners provided under the javax.cache.event package. These Cache entry listeners are listed below.

  • CacheEntryCreatedListener

  • CacheEntryExpiredListener

  • CacheEntryListener

  • CacheEntryReadListener

  • CacheEntryRemovedListener

  • CacheEntryUpdatedListener

These are the extension points provided in WSO2 carbon products for caching. These interfaces enable you to observe and take actions on the changes made to cache entries based on the relevant events. That is, if you need to perform some action when a cache entry is created, the CacheEntryCreatedListener interface can be implemented.

Once you implement a listener, for it to actually listen to the relevant event, you need to register your implementation on the cache. All the event handlers in these listeners gets CacheEntryEvent<? extends K, ? extends V> cacheEntryEvent object. So you can actually get the key and the value of the cache entry that triggers the particular event.

The following sample illustrates how to provide your custom implementation for these listeners and register them so that you can actually listen to these events. These implementations need to be bundled as an OSGi bundle and deployed for your Carbon product.

The process of implementing and deploying cache listeners are explained in the following sections:


Implementing cache listeners

This section illustrates sample implementations for the aforementioned listener classes. A bundle activator class will register these listeners into the cache and create an OSGi bundle out of the classes. Since the implementation process for all these 6 listeners is similar, this section illustrates only the implementation of CacheEntryCreatedListener.

package org.wso2.carbon.caching.test;

import javax.cache.event.CacheEntryCreatedListener;
import javax.cache.event.CacheEntryEvent;
import javax.cache.event.CacheEntryListenerException;

public class CacheEntryCreatedListenerImpl<K, V> implements CacheEntryCreatedListener<K, V> {
@Override
   public void entryCreated(CacheEntryEvent<? extends K, ? extends V> cacheEntryEvent) throws CacheEntryListenerException {
       //Your logic goes here
       System.out.println("Cache entry created");
       System.out.println("key: " + cacheEntryEvent.getKey() + ", value: " + cacheEntryEvent.getValue());
   }
}

Registering the listener

Once you implement the listener class, you need to register this listener in the cache. For this, let’s create a bundle activator class and register the listener as shown below.

package org.wso2.carbon.caching.test;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

import javax.cache.Cache;
import javax.cache.CacheManager;
import javax.cache.Caching;

public class CachingBundleActivator implements BundleActivator {
   public static final String CACHE_NAME = "CacheListener-cache";
   private Cache<String, Long> cache;
   private CacheEntryCreatedListenerImpl<String, Long> cacheEntryCreatedListener;

   public void start(BundleContext bundleContext) throws Exception {
       CacheManager cacheManager = Caching.getCacheManagerFactory().getCacheManager("test");
       cache = cacheManager.getCache(CACHE_NAME);

       cacheEntryCreatedListener = new CacheEntryCreatedListenerImpl<String, Long>();
       cache.registerCacheEntryListener(cacheEntryCreatedListener);      
   }

   public void stop(BundleContext bundleContext) throws Exception {

   }
}

Deploying the OSGi bundle

The following Maven plugin needs to be included in the pom.xml of your project to create an OSGi bundle.

<plugin>
   <groupId>org.apache.felix</groupId>
   <artifactId>maven-bundle-plugin</artifactId>
   <version>1.4.0</version>
   <extensions>true</extensions>
   <configuration>
       <instructions>
           <Bundle-SymbolicName>${pom.groupId}.${pom.artifactId}</Bundle-SymbolicName>
           <Bundle-Name>${pom.artifactId}</Bundle-Name>
           <Bundle-Version>1.0.0</Bundle-Version>
           <Export-Package>org.wso2.carbon.caching.test.*</Export-Package>
           <Bundle-Activator>org.wso2.carbon.caching.test.CachingBundleActivator</Bundle-Activator>
       </instructions>
   </configuration>
</plugin>
<plugin>

In addition to the aforementioned POM update, the packaging of your Maven project needs to be set to bundle (i.e: <packaging>bundle</packaging>). You can implement the remaining 5 listeners in a similar manner and create OSGi bundles. After building the OSGi bundle, add it to the <PRODUCT_HOME>/repository/components/dropins directory in your Carbon product.

  • No labels