package org.jboss.ejb.plugins;
import java.util.TimerTask;
import org.jboss.deployment.DeploymentException;
import org.jboss.metadata.MetaData;
import org.w3c.dom.Element;
public class LRUStatefulContextCachePolicy extends LRUEnterpriseContextCachePolicy
{
private long m_maxBeanLife;
private TimerTask m_remover;
private long m_removerPeriod;
private StatefulSessionInstanceCache ssiCache;
public LRUStatefulContextCachePolicy(AbstractInstanceCache eic)
{
super(eic);
ssiCache = (StatefulSessionInstanceCache) eic;
}
public void start()
{
super.start();
if (m_maxBeanLife > 0)
{
m_remover = new RemoverTask(m_removerPeriod);
long delay = (long) (Math.random() * m_removerPeriod);
tasksTimer.schedule(m_remover, delay, m_removerPeriod);
}
}
public void stop()
{
if (m_remover != null)
{
m_remover.cancel();
}
super.stop();
}
public void importXml(Element element) throws DeploymentException
{
super.importXml(element);
String rp = MetaData.getElementContent(MetaData.getOptionalChild(element, "remover-period"));
String ml = MetaData.getElementContent(MetaData.getOptionalChild(element, "max-bean-life"));
try
{
if (rp != null)
{
int p = Integer.parseInt(rp);
if (p <= 0)
{
throw new DeploymentException("Remover period can't be <= 0");
}
m_removerPeriod = p * 1000;
}
if (ml != null)
{
int a = Integer.parseInt(ml);
if (a <= 0)
{
throw new DeploymentException("Max bean life can't be <= 0");
}
m_maxBeanLife = a * 1000;
}
}
catch (NumberFormatException x)
{
throw new DeploymentException("Can't parse policy configuration", x);
}
}
protected class RemoverTask extends OveragerTask
{
protected RemoverTask(long period)
{
super(period);
}
protected String getTaskLogMessage()
{
return "Removing from cache bean";
}
protected void kickOut(LRUCacheEntry entry)
{
remove(entry.m_key);
}
protected long getMaxAge()
{
return m_maxBeanLife;
}
public void run()
{
if (ssiCache == null)
{
cancel();
return;
}
synchronized (ssiCache.getCacheLock())
{
log.debug("Running RemoverTask");
super.run();
log.debug("RemoverTask, PassivatedCount=" + ssiCache.getPassivatedCount());
}
try
{
ssiCache.removePassivated(getMaxAge() - super.getMaxAge());
log.debug("RemoverTask, done");
}
catch (Throwable e)
{
log.debug("Error during removals", e);
}
}
}
}