// ======================================================================== // $Id: AbstractStore.java,v 1.5 2004/06/22 16:23:44 jules_gosnell Exp $ // Copyright 2002-2004 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package org.mortbay.j2ee.session; //---------------------------------------- import java.util.Timer; import java.util.TimerTask; import javax.servlet.http.HttpServletRequest; import org.jboss.logging.Logger; //---------------------------------------- public abstract class AbstractStore implements Store { protected final static Logger _log = Logger.getLogger(AbstractStore.class); // distributed scavenging /** * The period between scavenges */ protected int _scavengerPeriod = 60 * 30; // 1/2 an hour public int getScavengerPeriod() { return _scavengerPeriod; } public void setScavengerPeriod(int secs) { _scavengerPeriod = secs; } /** * The extra time we wait before tidying up a CMPState to ensure that if it * loaded locally it will be scavenged locally first... */ protected int _scavengerExtraTime = 60 * 30; // 1/2 an hour public int getScavengerExtraTime() { return _scavengerExtraTime; } public void setScavengerExtraTime(int secs) { _scavengerExtraTime = secs; } /** * A maxInactiveInterval of -1 means never scavenge. The DB would fill up * very quickly - so we can override -1 with a real value here. */ protected int _actualMaxInactiveInterval = 60 * 60 * 24 * 28; // 28 days public int getActualMaxInactiveInterval() { return _actualMaxInactiveInterval; } public void setActualMaxInactiveInterval(int secs) { _actualMaxInactiveInterval = secs; } public Object clone() { try { AbstractStore as = (AbstractStore) (getClass().newInstance()); as.setScavengerPeriod(_scavengerPeriod); as.setScavengerExtraTime(_scavengerExtraTime); as.setActualMaxInactiveInterval(_actualMaxInactiveInterval); return as; } catch (Exception e) { _log.warn("could not clone Store", e); return null; } } protected Manager _manager; public Manager getManager() { return _manager; } public void setManager(Manager manager) { _manager = manager; } protected Timer _scavenger; // Store LifeCycle public void start() throws Exception { _log.trace("starting..."); boolean isDaemon = true; _scavenger = new Timer(isDaemon); long delay = _scavengerPeriod + Math.round(Math.random() * _scavengerPeriod); if (_log.isDebugEnabled()) _log.debug("starting distributed scavenger thread...(period: " + delay + " secs)"); _scavenger.scheduleAtFixedRate(new Scavenger(), delay * 1000, _scavengerPeriod * 1000); _log.debug("...distributed scavenger thread started"); _log.trace("...started"); } public void stop() { _log.trace("stopping..."); _log.debug("stopping distributed scavenger thread..."); _scavenger.cancel(); _scavenger = null; _log.debug("...distributed scavenger thread stopped"); try { scavenge(); } catch (Exception e) { _log.warn("error scavenging distributed sessions", e); } _log.trace("...stopped"); } public void destroy() { _log.trace("destroying..."); _log.trace("...destroyed"); } class Scavenger extends TimerTask { public void run() { try { scavenge(); } catch (Throwable e) { _log.warn("could not scavenge distributed sessions", e); } } } // ID allocation public String allocateId(HttpServletRequest request) { return getManager().getIdGenerator().nextId(request); } public void deallocateId(String id) { // these ids are disposable } // still abstract... // // Store LifeCycle // void destroy(); // corresponds to ctor // // boolean isDistributed(); // // // State LifeCycle // State newState(String id, int maxInactiveInterval) throws Exception; // State loadState(String id) throws Exception; // void storeState(State state) throws Exception; // void removeState(State state) throws Exception; // // // Store misc // void scavenge() throws Exception; // void passivateSession(StateAdaptor sa); }