All Downloads are FREE. Search and download functionalities are using the official Maven repository.

clime.messadmin.providers.lifecycle.SessionKiller Maven / Gradle / Ivy

/**
 * 
 */
package clime.messadmin.providers.lifecycle;

import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import clime.messadmin.model.Application;
import clime.messadmin.model.IApplicationInfo;
import clime.messadmin.model.Server;
import clime.messadmin.model.Session;
import clime.messadmin.providers.spi.ApplicationLifeCycleProvider;
import clime.messadmin.utils.SessionUtils;

/**
 * Manually expire zombie Tomcat HttpSessions...
 * @author Cédrik LIME
 */
public class SessionKiller implements ApplicationLifeCycleProvider {
	/**
	 * Default time to wait between two sweeps: {@value} ms.
	 */
	public static final long DELAY = 20*60*1000; // 20 minutes
	private static Timer timer;
	private static TimerTask timerTask;
	final static Set/**/ contexts = Collections.synchronizedSet(new HashSet());

	/**
	 * 
	 */
	public SessionKiller() {
		super();
		maybeInitialize();
	}

	protected static synchronized void maybeInitialize() {
		if (timerTask != null || timer != null) {
			return;
		}
		timerTask = new TimerTask() {
			/**
			 * {@inheritDoc}
			 */
			public void run() {
				try {
					synchronized (contexts) {
						Iterator appIter = contexts.iterator();
						while (appIter.hasNext()) {
							Application application = Server.getInstance().getApplication((String)appIter.next());
							if (application == null) {
								//shouldn't ever happen, but let's play safe
								continue;
							}
							try {
								Iterator sessIter = application.getActiveSessions().iterator();
								while (sessIter.hasNext()) {
									Session session = (Session) sessIter.next();
									if (session.getSessionInfo().getTTL() < 0) {
										reportExpiringSession(application.getApplicationInfo(), session.getSessionInfo());
										session.getSessionInfo().invalidate();
									}
								}
							} catch (RuntimeException rte) {
								//swallow
							}
						}
					}
				} catch (Exception e) {
					//swallow
				}
			}
		};
		timer = new Timer(true);//"Zombie Tomcat HttpSessions killer", true);
		timer.schedule(timerTask, DELAY, DELAY);
	}

	protected static void reportExpiringSession(IApplicationInfo application, HttpSession session) {
		String id = "";
		String contextPath = application.getContextPath();
		try {
			id = session.getId();
		} catch (IllegalStateException ise) {
		}
		System.out.println("MessAdmin INFO: invalidating expired session " + id + " for context " + contextPath);
	}


	/**
	 * {@inheritDoc}
	 */
	public void contextInitialized(ServletContext servletContext) {
		contexts.add(SessionUtils.getContext(servletContext));
	}

	/**
	 * {@inheritDoc}
	 */
	public void contextDestroyed(ServletContext servletContext) {
		contexts.remove(SessionUtils.getContext(servletContext));
	}

	/**
	 * {@inheritDoc}
	 */
	public int getPriority() {
		// no need for a priority, really
		return 0;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy