issue #69 添加Session的支持

This commit is contained in:
Daniel Qian
2015-01-21 19:58:40 +08:00
parent 7184711301
commit d18b66c38d
19 changed files with 320 additions and 69 deletions

View File

@@ -8,9 +8,9 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
public class SessionManagerImpl implements WxSessionManager, InternalSessionManager {
public class InMemorySessionManager implements WxSessionManager, InternalSessionManager {
protected final Logger log = LoggerFactory.getLogger(SessionManagerImpl.class);
protected final Logger log = LoggerFactory.getLogger(InMemorySessionManager.class);
protected static final StringManager sm =
StringManager.getManager(Constants.Package);
@@ -105,6 +105,11 @@ public class SessionManagerImpl implements WxSessionManager, InternalSessionMana
*/
protected int processExpiresFrequency = 6;
/**
* background processor delay in seconds
*/
protected int backgroundProcessorDelay = 10;
/**
* 后台清理线程是否已经开启
*/
@@ -204,7 +209,7 @@ public class SessionManagerImpl implements WxSessionManager, InternalSessionMana
while (true) {
try {
// 每秒清理一次
Thread.sleep(1000l);
Thread.sleep(backgroundProcessorDelay * 1000l);
backgroundProcess();
} catch (InterruptedException e) {
log.error("SessionManagerImpl.backgroundProcess error", e);
@@ -225,6 +230,7 @@ public class SessionManagerImpl implements WxSessionManager, InternalSessionMana
}
}
}
}
/**
@@ -269,6 +275,34 @@ public class SessionManagerImpl implements WxSessionManager, InternalSessionMana
}
@Override
public void setMaxInactiveInterval(int interval) {
this.maxInactiveInterval = interval;
}
/**
* Set the manager checks frequency.
*
* @param processExpiresFrequency the new manager checks frequency
*/
@Override
public void setProcessExpiresFrequency(int processExpiresFrequency) {
if (processExpiresFrequency <= 0) {
return;
}
this.processExpiresFrequency = processExpiresFrequency;
}
@Override
public void setBackgroundProcessorDelay(int backgroundProcessorDelay) {
this.backgroundProcessorDelay = backgroundProcessorDelay;
}
/**
* Return the descriptive short name of this Manager implementation.
*/

View File

@@ -10,7 +10,7 @@ public class InternalSessionFacade implements WxSession {
private WxSession session = null;
public InternalSessionFacade(WxSession session) {
session = session;
this.session = session;
}
@Override

View File

@@ -60,4 +60,15 @@ public interface InternalSessionManager {
*/
public void backgroundProcess();
/**
* Set the default maximum inactive interval (in seconds)
* for Sessions created by this Manager.
*
* @param interval The new default value
*/
void setMaxInactiveInterval(int interval);
void setProcessExpiresFrequency(int processExpiresFrequency);
void setBackgroundProcessorDelay(int backgroundProcessorDelay);
}

View File

@@ -308,4 +308,40 @@ public class SessionImpl implements WxSession, InternalSession {
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof SessionImpl)) return false;
SessionImpl session = (SessionImpl) o;
if (creationTime != session.creationTime) return false;
if (expiring != session.expiring) return false;
if (isValid != session.isValid) return false;
if (maxInactiveInterval != session.maxInactiveInterval) return false;
if (thisAccessedTime != session.thisAccessedTime) return false;
if (!accessCount.equals(session.accessCount)) return false;
if (!attributes.equals(session.attributes)) return false;
if (!facade.equals(session.facade)) return false;
if (!id.equals(session.id)) return false;
if (!manager.equals(session.manager)) return false;
return true;
}
@Override
public int hashCode() {
int result = attributes.hashCode();
result = 31 * result + id.hashCode();
result = 31 * result + (isValid ? 1 : 0);
result = 31 * result + (expiring ? 1 : 0);
result = 31 * result + manager.hashCode();
result = 31 * result + (int) (creationTime ^ (creationTime >>> 32));
result = 31 * result + (int) (thisAccessedTime ^ (thisAccessedTime >>> 32));
result = 31 * result + maxInactiveInterval;
result = 31 * result + facade.hashCode();
result = 31 * result + accessCount.hashCode();
return result;
}
}

View File

@@ -0,0 +1,68 @@
package me.chanjar.weixin.common.session;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@Test
public class TestSession {
@DataProvider
public Object[][] getSessionManager() {
return new Object[][] {
new Object[] { new InMemorySessionManager() }
};
}
@Test(dataProvider = "getSessionManager", expectedExceptions = IllegalStateException.class)
public void testInvalidate(WxSessionManager sessionManager) {
WxSession session = sessionManager.getSession("abc");
session.invalidate();
session.getAttributeNames();
}
@Test(dataProvider = "getSessionManager")
public void testInvalidate2(InternalSessionManager sessionManager) {
Assert.assertEquals(sessionManager.getActiveSessions(), 0);
WxSession session = ((WxSessionManager) sessionManager).getSession("abc");
Assert.assertEquals(sessionManager.getActiveSessions(), 1);
session.invalidate();
Assert.assertEquals(sessionManager.getActiveSessions(), 0);
}
@Test(dataProvider = "getSessionManager")
public void testGetSession(WxSessionManager sessionManager) {
WxSession session1 = sessionManager.getSession("abc");
WxSession session2 = sessionManager.getSession("abc");
Assert.assertTrue(session1.equals(session2));
WxSession abc1 = sessionManager.getSession("abc1");
Assert.assertFalse(session1.equals(abc1));
WxSession abc1b = sessionManager.getSession("abc1", false);
Assert.assertTrue(abc1.equals(abc1b));
WxSession def = sessionManager.getSession("def", false);
Assert.assertNull(def);
}
@Test(dataProvider = "getSessionManager")
public void testBackgroundProcess(WxSessionManager sessionManager) throws InterruptedException {
InternalSessionManager ism = (InternalSessionManager) sessionManager;
ism.setMaxInactiveInterval(1);
ism.setProcessExpiresFrequency(1);
ism.setBackgroundProcessorDelay(1);
Assert.assertEquals(ism.getActiveSessions(), 0);
InternalSession abc = ism.createSession("abc");
abc.endAccess();
Thread.sleep(2000l);
Assert.assertEquals(ism.getActiveSessions(), 0);
}
}

View File

@@ -8,6 +8,7 @@
<class name="me.chanjar.weixin.common.bean.WxMenuTest"/>
<class name="me.chanjar.weixin.common.util.crypto.WxCryptUtilTest"/>
<class name="me.chanjar.weixin.common.util.WxMessageInMemoryDuplicateCheckerTest"/>
<class name="me.chanjar.weixin.common.session.TestSession" />
</classes>
</test>
</suite>