package org.jboss.web.tomcat.tc5.session;
import java.util.HashMap;
import java.util.Iterator;
import org.apache.catalina.Context;
import org.apache.catalina.Session;
import org.jboss.logging.Logger;
public class IntervalSnapshotManager extends SnapshotManager implements Runnable
{
static Logger log = Logger.getLogger(IntervalSnapshotManager.class);
protected int interval = 1000;
protected HashMap sessions = new HashMap();
protected Thread thread = null;
protected boolean threadDone = false;
public IntervalSnapshotManager(AbstractJBossManager manager, String path)
{
super(manager, path);
}
public IntervalSnapshotManager(AbstractJBossManager manager, String path, int interval)
{
super(manager, path);
this.interval = interval;
}
public void snapshot(String id)
{
try
{
Session session = (Session) manager.findSession(id);
synchronized (sessions)
{
sessions.put(id, session);
}
}
catch (Exception e)
{
log.warn("Failed to replicate sessionID:" + id, e);
}
}
protected void processSessions()
{
HashMap copy = new HashMap(sessions.size());
synchronized (sessions)
{
copy.putAll(sessions);
sessions.clear();
}
Iterator iter = copy.values().iterator();
while (iter.hasNext())
{
Session session = (Session) iter.next();
manager.storeSession(session);
}
copy.clear();
}
public void start()
{
startThread();
}
public void stop()
{
stopThread();
synchronized (sessions)
{
sessions.clear();
}
}
protected void startThread()
{
if (thread != null)
{
return;
}
thread = new Thread(this, "ClusteredSessionDistributor[" + contextPath + "]");
thread.setDaemon(true);
thread.setContextClassLoader(manager.getContainer().getLoader().getClassLoader());
threadDone = false;
thread.start();
}
protected void stopThread()
{
if (thread == null)
{
return;
}
threadDone = true;
thread.interrupt();
try
{
thread.join();
}
catch (InterruptedException e)
{
}
thread = null;
}
protected void threadSleep()
{
try
{
Thread.sleep(interval);
}
catch (InterruptedException e)
{
}
}
public void run()
{
while (!threadDone)
{
threadSleep();
processSessions();
}
}
}