Skip to content

Commit 214f148

Browse files
committed
Saving namespace attributes only if they were changed. TTL delay.
1 parent 150ebf8 commit 214f148

File tree

3 files changed

+23
-5
lines changed

3 files changed

+23
-5
lines changed

src/main/java/com/github/mkopylec/sessioncouchbase/persistent/CouchbaseSession.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class CouchbaseSession implements ExpiringSession, Serializable {
3232
protected String id = randomUUID().toString();
3333
protected Map<String, Object> globalAttributes = new HashMap<>();
3434
protected Map<String, Object> namespaceAttributes = new HashMap<>();
35+
protected boolean namespacePersistenceRequired = false;
3536

3637
public CouchbaseSession(int timeoutInSeconds) {
3738
long now = currentTimeMillis();
@@ -115,6 +116,7 @@ public void setAttribute(String attributeName, Object attributeValue) {
115116
globalAttributes.put(name, attributeValue);
116117
} else {
117118
log.trace("Setting application namespace HTTP session attribute named '{}'", attributeName);
119+
namespacePersistenceRequired = true;
118120
namespaceAttributes.put(attributeName, attributeValue);
119121
}
120122
}
@@ -128,6 +130,7 @@ public void removeAttribute(String attributeName) {
128130
globalAttributes.remove(name);
129131
} else {
130132
log.trace("Removing application namespace HTTP session attribute named '{}'", attributeName);
133+
namespacePersistenceRequired = true;
131134
namespaceAttributes.remove(attributeName);
132135
}
133136
}
@@ -140,6 +143,10 @@ public Map<String, Object> getNamespaceAttributes() {
140143
return namespaceAttributes;
141144
}
142145

146+
public boolean isNamespacePersistenceRequired() {
147+
return namespacePersistenceRequired;
148+
}
149+
143150
protected void setCreationTime(long creationTime) {
144151
globalAttributes.put(CREATION_TIME_ATTRIBUTE, creationTime);
145152
}

src/main/java/com/github/mkopylec/sessioncouchbase/persistent/CouchbaseSessionRepository.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
public class CouchbaseSessionRepository implements SessionRepository<CouchbaseSession> {
1818

1919
protected static final String GLOBAL_NAMESPACE = "global";
20+
protected static final int SESSION_ENTITY_EXPIRATION_DELAY_IN_SECONDS = 60;
2021

2122
private static final Logger log = getLogger(CouchbaseSessionRepository.class);
2223

@@ -49,7 +50,7 @@ public CouchbaseSession createSession() {
4950
sessionData.put(namespace, session.getNamespaceAttributes());
5051
SessionEntity sessionEntity = new SessionEntity(session.getId(), sessionData);
5152
dao.save(sessionEntity);
52-
dao.updateExpirationTime(session.getId(), sessionTimeout);
53+
dao.updateExpirationTime(session.getId(), getSessionEntityExpiration());
5354

5455
return session;
5556
}
@@ -59,10 +60,14 @@ public void save(CouchbaseSession session) {
5960
log.debug("Saving HTTP session with ID {}", session.getId());
6061

6162
Map<String, Object> serializedGlobal = serializer.serializeSessionAttributes(session.getGlobalAttributes());
62-
Map<String, Object> serializedNamespace = serializer.serializeSessionAttributes(session.getNamespaceAttributes());
6363
dao.updateSession(from(serializedGlobal), GLOBAL_NAMESPACE, session.getId());
64-
dao.updateSession(from(serializedNamespace), namespace, session.getId());
65-
dao.updateExpirationTime(session.getId(), sessionTimeout);
64+
65+
if (session.isNamespacePersistenceRequired()) {
66+
Map<String, Object> serializedNamespace = serializer.serializeSessionAttributes(session.getNamespaceAttributes());
67+
dao.updateSession(from(serializedNamespace), namespace, session.getId());
68+
}
69+
70+
dao.updateExpirationTime(session.getId(), getSessionEntityExpiration());
6671
}
6772

6873
@Override
@@ -97,4 +102,8 @@ public void delete(String id) {
97102
log.debug("Deleting HTTP session with ID {}", id);
98103
dao.delete(id);
99104
}
105+
106+
protected int getSessionEntityExpiration() {
107+
return sessionTimeout + SESSION_ENTITY_EXPIRATION_DELAY_IN_SECONDS;
108+
}
100109
}

src/test/resources/application.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ session-couchbase:
66
bucket-name: default
77
password:
88
in-memory:
9-
enabled: false
9+
enabled: false
10+
11+
logging.level.com.github.mkopylec.sessioncouchbase: trace

0 commit comments

Comments
 (0)