Skip to content

Commit

Permalink
Implement findSessions() and return all sessions in the cluster. (#40)
Browse files Browse the repository at this point in the history
Fixes #39
  • Loading branch information
bergander authored and emre-aydin committed Mar 27, 2018
1 parent bb88c37 commit 2c09b20
Show file tree
Hide file tree
Showing 17 changed files with 286 additions and 15 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.hazelcast.session;

import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import org.apache.http.client.CookieStore;
import org.apache.http.impl.client.BasicCookieStore;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

public abstract class AbstractSessionExpireTest extends AbstractHazelcastSessionsTest {

@Test
public void testSessionExpireAfterFailoverAndSessionTimeout() throws Exception {
final int SESSION_TIMEOUT_IN_MINUTES = 1;
final int EXTRA_DELAY_IN_SECONDS = 5;

instance1 = getWebContainerConfigurator();
instance1.port(SERVER_PORT_1)
.sticky(true)
.clientOnly(false)
.mapName(SESSION_REPLICATION_MAP_NAME)
.sessionTimeout(SESSION_TIMEOUT_IN_MINUTES)
.configLocation("hazelcast-1.xml")
.start();

instance2 = getWebContainerConfigurator();
instance2.port(SERVER_PORT_2)
.sticky(true)
.clientOnly(false)
.mapName(SESSION_REPLICATION_MAP_NAME)
.sessionTimeout(SESSION_TIMEOUT_IN_MINUTES)
.configLocation("hazelcast-2.xml")
.start();

CookieStore cookieStore = new BasicCookieStore();
executeRequest("write", SERVER_PORT_1, cookieStore);
String value = executeRequest("read", SERVER_PORT_1, cookieStore);
assertEquals("value", value);

instance1.stop();

HazelcastInstance hzInstance1 = Hazelcast.getHazelcastInstanceByName("hzInstance1");
if (hzInstance1 != null) {
hzInstance1.shutdown();
}


sleepSeconds(SESSION_TIMEOUT_IN_MINUTES * 60 + EXTRA_DELAY_IN_SECONDS);

assertEquals(0, instance2.getManager().getDistributedMap().size());

instance2.stop();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

public class HazelcastSessionManager extends ManagerBase implements Lifecycle, PropertyChangeListener, SessionManager {

Expand Down Expand Up @@ -259,6 +262,31 @@ public Session findSession(String id) throws IOException {
}
}

@Override
public Session[] findSessions() {
// Get all local sessions
Set<Session> allSessions = new HashSet<Session>(sessions.values());

// Get all non-local sessions ids
Set<String> keys = new HashSet<String>(sessionMap.keySet());
keys.removeAll(sessions.keySet());

// Get all non-local sessions
final Collection<HazelcastSession> nonLocalSessions = sessionMap.getAll(keys).values();

// Set SessionManager since it's a transient field
for (HazelcastSession nonLocalSession : nonLocalSessions) {
if (nonLocalSession.getManager() == null) {
nonLocalSession.setSessionManager(this);
}
}

// Add all non-local sessions
allSessions.addAll(nonLocalSessions);

return allSessions.toArray(new Session[allSessions.size()]);
}

public void commit(Session session) {
HazelcastSession hazelcastSession = (HazelcastSession) session;
if (hazelcastSession.isDirty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,5 +119,6 @@ private void updateManager(HazelcastSessionManager manager) {
manager.setMapName(mapName);
manager.setMaxInactiveInterval(sessionTimeout);
manager.setDeferredWrite(deferredWrite);
manager.setProcessExpiresFrequency(1);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.hazelcast.session;

import com.hazelcast.test.HazelcastSerialClassRunner;
import com.hazelcast.test.annotation.QuickTest;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;

@RunWith(HazelcastSerialClassRunner.class)
@Category(QuickTest.class)
public class Tomcat6SessionExpireTest extends AbstractSessionExpireTest {
@Override
protected WebContainerConfigurator<?> getWebContainerConfigurator() {
return new Tomcat6Configurator();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

public class HazelcastSessionManager extends ManagerBase implements Lifecycle, PropertyChangeListener, SessionManager {

Expand Down Expand Up @@ -258,6 +261,31 @@ public Session findSession(String id) throws IOException {
}
}

@Override
public Session[] findSessions() {
// Get all local sessions
Set<Session> allSessions = new HashSet<Session>(sessions.values());

// Get all non-local sessions ids
Set<String> keys = new HashSet<String>(sessionMap.keySet());
keys.removeAll(sessions.keySet());

// Get all non-local sessions
final Collection<HazelcastSession> nonLocalSessions = sessionMap.getAll(keys).values();

// Set SessionManager since it's a transient field
for (HazelcastSession nonLocalSession : nonLocalSessions) {
if (nonLocalSession.getManager() == null) {
nonLocalSession.setSessionManager(this);
}
}

// Add all non-local sessions
allSessions.addAll(nonLocalSessions);

return allSessions.toArray(new Session[allSessions.size()]);
}

public void commit(Session session) {
HazelcastSession hazelcastSession = (HazelcastSession) session;
if (hazelcastSession.isDirty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ private void updateManager(HazelcastSessionManager manager) {
manager.setSticky(sticky);
manager.setClientOnly(clientOnly);
manager.setMapName(mapName);
manager.setMaxInactiveInterval(sessionTimeout);
manager.setDeferredWrite(deferredWrite);
manager.setProcessExpiresFrequency(1);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,5 +94,6 @@ private void updateManager(HazelcastSessionManager manager) {
manager.setMapName(mapName);
manager.setMaxInactiveInterval(sessionTimeout);
manager.setDeferredWrite(deferredWrite);
manager.setProcessExpiresFrequency(1);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.hazelcast.session;

import com.hazelcast.test.HazelcastSerialClassRunner;
import com.hazelcast.test.annotation.QuickTest;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;

@RunWith(HazelcastSerialClassRunner.class)
@Category(QuickTest.class)
public class Tomcat7SessionExpireTest extends AbstractSessionExpireTest {
@Override
protected WebContainerConfigurator<?> getWebContainerConfigurator() {
return new Tomcat7Configurator();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

public class HazelcastSessionManager extends ManagerBase implements Lifecycle, PropertyChangeListener, SessionManager {

Expand All @@ -51,6 +54,10 @@ public class HazelcastSessionManager extends ManagerBase implements Lifecycle, P

private HazelcastInstance instance;

public void setSessionTimeout(int t) {
getContext().setSessionTimeout(t);
}

@Override
public String getName() {
return NAME;
Expand Down Expand Up @@ -251,6 +258,31 @@ public Session findSession(String id) throws IOException {
}
}

@Override
public Session[] findSessions() {
// Get all local sessions
Set<Session> allSessions = new HashSet<Session>(sessions.values());

// Get all non-local sessions ids
Set<String> keys = new HashSet<String>(sessionMap.keySet());
keys.removeAll(sessions.keySet());

// Get all non-local sessions
final Collection<HazelcastSession> nonLocalSessions = sessionMap.getAll(keys).values();

// Set SessionManager since it's a transient field
for (HazelcastSession nonLocalSession : nonLocalSessions) {
if (nonLocalSession.getManager() == null) {
nonLocalSession.setSessionManager(this);
}
}

// Add all non-local sessions
allSessions.addAll(nonLocalSessions);

return allSessions.toArray(new Session[allSessions.size()]);
}

public void commit(Session session) {
HazelcastSession hazelcastSession = (HazelcastSession) session;
if (hazelcastSession.isDirty()) {
Expand Down
10 changes: 10 additions & 0 deletions tomcat8/src/test/java/Tomcat8SessionExpireTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import com.hazelcast.session.AbstractSessionExpireTest;
import com.hazelcast.session.Tomcat8Configurator;
import com.hazelcast.session.WebContainerConfigurator;

public class Tomcat8SessionExpireTest extends AbstractSessionExpireTest {
@Override
protected WebContainerConfigurator<?> getWebContainerConfigurator() {
return new Tomcat8Configurator();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class Tomcat8AsyncConfigurator extends WebContainerConfigurator<Tomcat> {
private final String baseDir;

private Tomcat tomcat;
private SessionManager manager;
private HazelcastSessionManager manager;

public Tomcat8AsyncConfigurator(String baseDir) {
this.baseDir = baseDir;
Expand Down Expand Up @@ -53,8 +53,8 @@ public Tomcat configure() throws Exception {
}

this.manager = new HazelcastSessionManager();
context.setManager((HazelcastSessionManager) manager);
updateManager((HazelcastSessionManager) manager);
context.setManager(manager);
updateManager(manager);
context.setCookies(true);
context.setBackgroundProcessorDelay(1);
context.setReloadable(true);
Expand All @@ -66,6 +66,7 @@ public Tomcat configure() throws Exception {
public void start() throws Exception {
tomcat = configure();
tomcat.start();
setSessionTimeout();
}

@Override
Expand All @@ -82,6 +83,7 @@ public void reload() {
context = (Context) tomcat.getHost().findChild("");
}
context.reload();
setSessionTimeout();
}

@Override
Expand All @@ -94,5 +96,10 @@ private void updateManager(HazelcastSessionManager manager) {
manager.setClientOnly(clientOnly);
manager.setMapName(mapName);
manager.setDeferredWrite(deferredWrite);
manager.setProcessExpiresFrequency(1);
}

private void setSessionTimeout() {
manager.setSessionTimeout(sessionTimeout);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
public class Tomcat8Configurator extends WebContainerConfigurator<Tomcat> {

private Tomcat tomcat;
private SessionManager manager;
private HazelcastSessionManager manager;
private String appName;

public Tomcat8Configurator(String appName) {
Expand Down Expand Up @@ -58,8 +58,8 @@ public Tomcat configure() throws Exception {
}

this.manager = new HazelcastSessionManager();
context.setManager((HazelcastSessionManager) manager);
updateManager((HazelcastSessionManager) manager);
context.setManager(manager);
updateManager(manager);
context.setCookies(true);
context.setBackgroundProcessorDelay(1);
context.setReloadable(true);
Expand All @@ -71,6 +71,7 @@ public Tomcat configure() throws Exception {
public void start() throws Exception {
tomcat = configure();
tomcat.start();
setSessionTimeout();
}

@Override
Expand All @@ -88,6 +89,7 @@ public void reload() {
context = (Context) tomcat.getHost().findChild("");
}
context.reload();
setSessionTimeout();
}

@Override
Expand All @@ -99,7 +101,11 @@ private void updateManager(HazelcastSessionManager manager) {
manager.setSticky(sticky);
manager.setClientOnly(clientOnly);
manager.setMapName(mapName);
manager.setMaxInactiveInterval(sessionTimeout);
manager.setDeferredWrite(deferredWrite);
manager.setProcessExpiresFrequency(1);
}

private void setSessionTimeout() {
manager.setSessionTimeout(sessionTimeout);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.hazelcast.session;

import com.hazelcast.test.HazelcastSerialClassRunner;
import com.hazelcast.test.annotation.QuickTest;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;

@RunWith(HazelcastSerialClassRunner.class)
@Category(QuickTest.class)
public class Tomcat8SessionExpireTest extends AbstractSessionExpireTest {
@Override
protected WebContainerConfigurator<?> getWebContainerConfigurator() {
return new Tomcat8Configurator();
}
}
Loading

0 comments on commit 2c09b20

Please sign in to comment.