Example #1
0
  /**
   * Removes expired elements.
   *
   * <p>Note that the DiskStore cannot efficiently expire based on TTI. It does it on TTL. However
   * any gets out of the DiskStore are check for both before return.
   *
   * @noinspection SynchronizeOnNonFinalField
   */
  public void expireElements() {
    final long now = System.currentTimeMillis();

    // Clean up the spool
    synchronized (spoolLock) {
      for (Iterator iterator = spool.values().iterator(); iterator.hasNext(); ) {
        final Element element = (Element) iterator.next();
        if (element.isExpired()) {
          // An expired element
          if (LOG.isDebugEnabled()) {
            LOG.debug(name + "Cache: Removing expired spool element " + element.getObjectKey());
          }
          iterator.remove();
          notifyExpiryListeners(element);
        }
      }
    }

    Element element = null;
    RegisteredEventListeners listeners = cache.getCacheEventNotificationService();
    synchronized (diskElements) {
      // Clean up disk elements
      for (Iterator iterator = diskElements.entrySet().iterator(); iterator.hasNext(); ) {
        final Map.Entry entry = (Map.Entry) iterator.next();
        final DiskElement diskElement = (DiskElement) entry.getValue();

        if (now >= diskElement.expiryTime) {
          // An expired element
          if (LOG.isDebugEnabled()) {
            LOG.debug(
                name
                    + "Cache: Removing expired spool element "
                    + entry.getKey()
                    + " from Disk Store");
          }

          iterator.remove();

          // only load the element from the file if there is a listener interested in hearing about
          // its expiration
          if (listeners.hasCacheEventListeners()) {
            try {
              element = loadElementFromDiskElement(diskElement);
              notifyExpiryListeners(element);
            } catch (Exception exception) {
              LOG.error(
                  name
                      + "Cache: Could not remove disk store entry for "
                      + entry.getKey()
                      + ". Error was "
                      + exception.getMessage(),
                  exception);
            }
          }
          freeBlock(diskElement);
        }
      }
    }
  }
  @Test
  public void testCacheListenerCopying() {
    RegisteredEventListeners registeredEventListeners =
        _ehcachePortalCache.ehcache.getCacheEventNotificationService();

    Set<CacheEventListener> cacheEventListeners = registeredEventListeners.getCacheEventListeners();

    Assert.assertEquals(1, cacheEventListeners.size());

    Iterator<CacheEventListener> iterator = cacheEventListeners.iterator();

    CacheEventListener cacheEventListener = iterator.next();

    Assert.assertTrue(cacheEventListener instanceof PortalCacheCacheEventListener);

    PortalCacheCacheEventListener<Serializable, Serializable> portalCacheCacheEventListener =
        (PortalCacheCacheEventListener<Serializable, Serializable>) cacheEventListener;

    Assert.assertSame(_defaultCacheListener, portalCacheCacheEventListener.getCacheListener());
    Assert.assertSame(_ehcachePortalCache, portalCacheCacheEventListener.getPortalCache());

    String newCacheName = "newCache";

    _cacheManager.addCache(newCacheName);

    Cache newCache = _cacheManager.getCache(newCacheName);

    _ehcachePortalCache.setEhcache(newCache);

    registeredEventListeners = newCache.getCacheEventNotificationService();

    Assert.assertEquals(1, cacheEventListeners.size());

    iterator = cacheEventListeners.iterator();

    cacheEventListener = iterator.next();

    Assert.assertTrue(cacheEventListener instanceof PortalCacheCacheEventListener);

    portalCacheCacheEventListener =
        (PortalCacheCacheEventListener<Serializable, Serializable>) cacheEventListener;

    Assert.assertSame(_defaultCacheListener, portalCacheCacheEventListener.getCacheListener());
    Assert.assertSame(_ehcachePortalCache, portalCacheCacheEventListener.getPortalCache());
  }
Example #3
0
 private void notifyEvictionListeners(DiskElement diskElement) {
   RegisteredEventListeners listeners = cache.getCacheEventNotificationService();
   // only load the element from the file if there is a listener interested in hearing about its
   // expiration
   if (listeners.hasCacheEventListeners()) {
     Element element = null;
     try {
       element = loadElementFromDiskElement(diskElement);
       cache.getCacheEventNotificationService().notifyElementEvicted(element, false);
     } catch (Exception exception) {
       LOG.error(
           name
               + "Cache: Could not notify disk store eviction of "
               + element.getObjectKey()
               + ". Error was "
               + exception.getMessage(),
           exception);
     }
   }
 }
 /** A factory method to create a RegisteredEventListeners */
 protected static void registerCacheListeners(
     CacheConfiguration cacheConfiguration, RegisteredEventListeners registeredEventListeners) {
   List cacheEventListenerConfigurations =
       cacheConfiguration.getCacheEventListenerConfigurations();
   for (Object cacheEventListenerConfiguration : cacheEventListenerConfigurations) {
     CacheConfiguration.CacheEventListenerFactoryConfiguration factoryConfiguration =
         (CacheConfiguration.CacheEventListenerFactoryConfiguration)
             cacheEventListenerConfiguration;
     CacheEventListener cacheEventListener = createCacheEventListener(factoryConfiguration);
     registeredEventListeners.registerListener(cacheEventListener);
   }
 }