diff --git a/java/org/apache/catalina/session/PersistentManagerBase.java b/java/org/apache/catalina/session/PersistentManagerBase.java index a562757..fde08ba 100644 --- a/java/org/apache/catalina/session/PersistentManagerBase.java +++ b/java/org/apache/catalina/session/PersistentManagerBase.java @@ -135,6 +135,11 @@ public abstract class PersistentManagerBase extends ManagerBase */ private static final String name = "PersistentManagerBase"; + /** + * Key of the note of a session in which the timestamp of last backup is stored. + */ + private static final String PERSISTED_LAST_ACCESSED_TIME = "org.apache.catalina.session.PersistentManagerBase.persistedLastAccessedTime"; + /** * Store object which will manage the Session store. @@ -177,6 +182,12 @@ public abstract class PersistentManagerBase extends ManagerBase private final Map sessionSwapInLocks = new HashMap<>(); + /** + * Only backup session once, while lastAccessedTime of the session is not changed + */ + protected boolean backupOnceAfterAccess = false; + + // ------------------------------------------------------------- Properties @@ -284,6 +295,33 @@ public abstract class PersistentManagerBase extends ManagerBase /** + * Flag which determines if a session will be backed up only once after + * reaching maxIdleBackup with same lastAccessedTime + */ + public boolean getBackupOnceAfterAccess() { + + return this.backupOnceAfterAccess; + + } + + /** + * Sets the flag, which determines if a session will be backed up only once + * after reaching maxIdleBackup while lastAccessedTime is not changed, or + * everytime when sessions will be checked for backup + */ + public void setBackupOnceAfterAccess(boolean backupOnce) { + + if (this.backupOnceAfterAccess == backupOnce) + return; + boolean oldBackupOnceAfterAccess = this.backupOnceAfterAccess; + this.backupOnceAfterAccess = backupOnce; + support.firePropertyChange("backupOnceAfterAccess", + Boolean.valueOf(oldBackupOnceAfterAccess), + Boolean.valueOf(this.backupOnceAfterAccess)); + + } + + /** * Return true, if the session id is loaded in memory * otherwise false is returned * @@ -988,6 +1026,13 @@ public abstract class PersistentManagerBase extends ManagerBase synchronized (session) { if (!session.isValid()) continue; + long lastAccessedTime = session.getLastAccessedTime(); + if (backupOnceAfterAccess) { + Long persistedLastAccessedTime = (Long) session.getNote(PERSISTED_LAST_ACCESSED_TIME); + if (persistedLastAccessedTime != null && + lastAccessedTime == persistedLastAccessedTime.longValue()) + continue; + } int timeIdle = (int) (session.getIdleTime() / 1000L); if (timeIdle > maxIdleBackup) { if (log.isDebugEnabled()) @@ -1001,6 +1046,8 @@ public abstract class PersistentManagerBase extends ManagerBase } catch (IOException e) { // This is logged in writeSession() } + if (backupOnceAfterAccess) + session.setNote(PERSISTED_LAST_ACCESSED_TIME, Long.valueOf(lastAccessedTime)); } } } diff --git a/java/org/apache/catalina/session/mbeans-descriptors.xml b/java/org/apache/catalina/session/mbeans-descriptors.xml index 4f9b01e..c32f6f3 100644 --- a/java/org/apache/catalina/session/mbeans-descriptors.xml +++ b/java/org/apache/catalina/session/mbeans-descriptors.xml @@ -215,6 +215,10 @@ type="int" writeable="false"/> + + savedIds = new ArrayList(); + + List getSavedIds() { + return savedIds; + } + + @Override + public Manager getManager() { + return this.manager; + } + + @Override + public void setManager(Manager manager) { + this.manager = manager; + } + + @Override + public int getSize() throws IOException { + return 0; + } + + @Override + public void addPropertyChangeListener(PropertyChangeListener listener) { + } + + @Override + public String[] keys() throws IOException { + return null; + } + + @Override + public Session load(String id) throws ClassNotFoundException, + IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public void remove(String id) throws IOException { + } + + @Override + public void clear() throws IOException { + } + + @Override + public void removePropertyChangeListener(PropertyChangeListener listener) { + } + + @Override + public void save(Session session) throws IOException { + savedIds.add(session.getId()); + } + + } +} diff --git a/webapps/docs/config/manager.xml b/webapps/docs/config/manager.xml index de97cfd..9509568 100644 --- a/webapps/docs/config/manager.xml +++ b/webapps/docs/config/manager.xml @@ -200,6 +200,13 @@ + +

If sessions should be backed up only once while not accessed. If + false all sessions which are not accessed for + maxIdelBackup will be backed up every time. Default is + false.

+
+

It has the same meaning as described in the Common Attributes above.