issue #69 添加Session的支持,添加测试用例
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package me.chanjar.weixin.cp.api;
|
||||
|
||||
import me.chanjar.weixin.common.session.WxSession;
|
||||
import me.chanjar.weixin.common.session.WxSessionManager;
|
||||
import me.chanjar.weixin.cp.bean.WxCpXmlMessage;
|
||||
import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage;
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
package me.chanjar.weixin.cp.api;
|
||||
|
||||
import me.chanjar.weixin.common.session.InternalSession;
|
||||
import me.chanjar.weixin.common.session.WxSession;
|
||||
import me.chanjar.weixin.common.session.InMemorySessionManager;
|
||||
import me.chanjar.weixin.common.session.WxSessionManager;
|
||||
import me.chanjar.weixin.common.session.*;
|
||||
import me.chanjar.weixin.common.util.WxMessageDuplicateChecker;
|
||||
import me.chanjar.weixin.common.util.WxMessageInMemoryDuplicateChecker;
|
||||
import me.chanjar.weixin.cp.bean.WxCpXmlMessage;
|
||||
@@ -69,7 +66,7 @@ public class WxCpMessageRouter {
|
||||
this.wxCpService = wxCpService;
|
||||
this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE);
|
||||
this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker();
|
||||
this.sessionManager = new InMemorySessionManager();
|
||||
this.sessionManager = new StandardSessionManager();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -152,10 +149,12 @@ public class WxCpMessageRouter {
|
||||
);
|
||||
} else {
|
||||
res = rule.service(wxMessage);
|
||||
// 在同步操作结束,session访问结束
|
||||
log.trace("End session access after sync operation finish {}", wxMessage.getFromUserName());
|
||||
sessionEndAccess(wxMessage);
|
||||
}
|
||||
}
|
||||
|
||||
// 告诉session,它已经用不着了
|
||||
if (futures.size() > 0) {
|
||||
executorService.submit(new Runnable() {
|
||||
@Override
|
||||
@@ -163,19 +162,17 @@ public class WxCpMessageRouter {
|
||||
for (Future future : futures) {
|
||||
try {
|
||||
future.get();
|
||||
log.trace("End session access after async operation finish {}", wxMessage.getFromUserName());
|
||||
// 异步操作结束,session访问结束
|
||||
sessionEndAccess(wxMessage);
|
||||
} catch (InterruptedException e) {
|
||||
log.error("Error happened when wait task finish", e);
|
||||
} catch (ExecutionException e) {
|
||||
log.error("Error happened when wait task finish", e);
|
||||
}
|
||||
}
|
||||
// 在这里session再也不会被使用了
|
||||
sessionEndAccess(wxMessage);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// 在这里session再也不会被使用了
|
||||
sessionEndAccess(wxMessage);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@@ -185,10 +182,12 @@ public class WxCpMessageRouter {
|
||||
* @param wxMessage
|
||||
*/
|
||||
protected void sessionEndAccess(WxCpXmlMessage wxMessage) {
|
||||
WxSession session = sessionManager.getSession(wxMessage.getFromUserName(), false);
|
||||
|
||||
InternalSession session = ((InternalSessionManager)sessionManager).findSession(wxMessage.getFromUserName());
|
||||
if (session != null) {
|
||||
((InternalSession) session).endAccess();
|
||||
session.endAccess();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class Rule {
|
||||
|
||||
@@ -392,7 +392,7 @@ public interface WxCpService {
|
||||
/**
|
||||
* <pre>
|
||||
* 设置WxSessionManager,只有当需要使用个性化的WxSessionManager的时候才需要调用此方法,
|
||||
* WxCpService默认使用的是{@link me.chanjar.weixin.common.session.InMemorySessionManager}
|
||||
* WxCpService默认使用的是{@link me.chanjar.weixin.common.session.StandardSessionManager}
|
||||
* </pre>
|
||||
* @param sessionManager
|
||||
*/
|
||||
|
||||
@@ -12,7 +12,7 @@ import me.chanjar.weixin.common.bean.WxMenu;
|
||||
import me.chanjar.weixin.common.bean.result.WxError;
|
||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
|
||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||
import me.chanjar.weixin.common.session.InMemorySessionManager;
|
||||
import me.chanjar.weixin.common.session.StandardSessionManager;
|
||||
import me.chanjar.weixin.common.session.WxSession;
|
||||
import me.chanjar.weixin.common.session.WxSessionManager;
|
||||
import me.chanjar.weixin.common.util.StringUtils;
|
||||
@@ -66,7 +66,7 @@ public class WxCpServiceImpl implements WxCpService {
|
||||
|
||||
private int maxRetryTimes = 5;
|
||||
|
||||
protected WxSessionManager sessionManager = new InMemorySessionManager();
|
||||
protected WxSessionManager sessionManager = new StandardSessionManager();
|
||||
|
||||
public boolean checkSignature(String msgSignature, String timestamp, String nonce, String data) {
|
||||
try {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package me.chanjar.weixin.cp.api;
|
||||
|
||||
import me.chanjar.weixin.common.api.WxConsts;
|
||||
import me.chanjar.weixin.common.session.StandardSessionManager;
|
||||
import me.chanjar.weixin.common.session.WxSessionManager;
|
||||
import me.chanjar.weixin.cp.bean.WxCpXmlMessage;
|
||||
import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage;
|
||||
@@ -159,4 +160,137 @@ public class WxCpMessageRouterTest {
|
||||
|
||||
}
|
||||
|
||||
@DataProvider
|
||||
public Object[][] standardSessionManager() {
|
||||
|
||||
// 故意把session存活时间变短,清理更频繁
|
||||
StandardSessionManager ism = new StandardSessionManager();
|
||||
ism.setMaxInactiveInterval(1);
|
||||
ism.setProcessExpiresFrequency(1);
|
||||
ism.setBackgroundProcessorDelay(1);
|
||||
|
||||
return new Object[][] {
|
||||
new Object[] { ism }
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@Test(dataProvider = "standardSessionManager")
|
||||
public void testSessionClean1(StandardSessionManager ism) throws InterruptedException {
|
||||
|
||||
// 两个同步请求,看是否处理完毕后会被清理掉
|
||||
final WxCpMessageRouter router = new WxCpMessageRouter(null);
|
||||
router.setSessionManager(ism);
|
||||
router
|
||||
.rule().async(false).handler(new WxSessionMessageHandler()).next()
|
||||
.rule().async(false).handler(new WxSessionMessageHandler()).end();
|
||||
|
||||
WxCpXmlMessage msg = new WxCpXmlMessage();
|
||||
msg.setFromUserName("abc");
|
||||
router.route(msg);
|
||||
|
||||
Thread.sleep(2000l);
|
||||
Assert.assertEquals(ism.getActiveSessions(), 0);
|
||||
|
||||
}
|
||||
|
||||
@Test(dataProvider = "standardSessionManager")
|
||||
public void testSessionClean2(StandardSessionManager ism) throws InterruptedException {
|
||||
|
||||
// 1个同步,1个异步请求,看是否处理完毕后会被清理掉
|
||||
{
|
||||
final WxCpMessageRouter router = new WxCpMessageRouter(null);
|
||||
router.setSessionManager(ism);
|
||||
router
|
||||
.rule().async(false).handler(new WxSessionMessageHandler()).next()
|
||||
.rule().async(true).handler(new WxSessionMessageHandler()).end();
|
||||
|
||||
WxCpXmlMessage msg = new WxCpXmlMessage();
|
||||
msg.setFromUserName("abc");
|
||||
router.route(msg);
|
||||
|
||||
Thread.sleep(2000l);
|
||||
Assert.assertEquals(ism.getActiveSessions(), 0);
|
||||
}
|
||||
{
|
||||
final WxCpMessageRouter router = new WxCpMessageRouter(null);
|
||||
router.setSessionManager(ism);
|
||||
router
|
||||
.rule().async(true).handler(new WxSessionMessageHandler()).next()
|
||||
.rule().async(false).handler(new WxSessionMessageHandler()).end();
|
||||
|
||||
WxCpXmlMessage msg = new WxCpXmlMessage();
|
||||
msg.setFromUserName("abc");
|
||||
router.route(msg);
|
||||
|
||||
Thread.sleep(2000l);
|
||||
Assert.assertEquals(ism.getActiveSessions(), 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test(dataProvider = "standardSessionManager")
|
||||
public void testSessionClean3(StandardSessionManager ism) throws InterruptedException {
|
||||
|
||||
// 2个异步请求,看是否处理完毕后会被清理掉
|
||||
final WxCpMessageRouter router = new WxCpMessageRouter(null);
|
||||
router.setSessionManager(ism);
|
||||
router
|
||||
.rule().async(true).handler(new WxSessionMessageHandler()).next()
|
||||
.rule().async(true).handler(new WxSessionMessageHandler()).end();
|
||||
|
||||
WxCpXmlMessage msg = new WxCpXmlMessage();
|
||||
msg.setFromUserName("abc");
|
||||
router.route(msg);
|
||||
|
||||
Thread.sleep(2000l);
|
||||
Assert.assertEquals(ism.getActiveSessions(), 0);
|
||||
|
||||
}
|
||||
|
||||
@Test(dataProvider = "standardSessionManager")
|
||||
public void testSessionClean4(StandardSessionManager ism) throws InterruptedException {
|
||||
|
||||
// 一个同步请求,看是否处理完毕后会被清理掉
|
||||
{
|
||||
final WxCpMessageRouter router = new WxCpMessageRouter(null);
|
||||
router.setSessionManager(ism);
|
||||
router
|
||||
.rule().async(false).handler(new WxSessionMessageHandler()).end();
|
||||
|
||||
WxCpXmlMessage msg = new WxCpXmlMessage();
|
||||
msg.setFromUserName("abc");
|
||||
router.route(msg);
|
||||
|
||||
Thread.sleep(2000l);
|
||||
Assert.assertEquals(ism.getActiveSessions(), 0);
|
||||
}
|
||||
|
||||
{
|
||||
final WxCpMessageRouter router = new WxCpMessageRouter(null);
|
||||
router.setSessionManager(ism);
|
||||
router
|
||||
.rule().async(true).handler(new WxSessionMessageHandler()).end();
|
||||
|
||||
WxCpXmlMessage msg = new WxCpXmlMessage();
|
||||
msg.setFromUserName("abc");
|
||||
router.route(msg);
|
||||
|
||||
Thread.sleep(2000l);
|
||||
Assert.assertEquals(ism.getActiveSessions(), 0);
|
||||
}
|
||||
}
|
||||
|
||||
public static class WxSessionMessageHandler implements WxCpMessageHandler {
|
||||
|
||||
@Override
|
||||
public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService wxCpService,
|
||||
WxSessionManager sessionManager) {
|
||||
sessionManager.getSession(wxMessage.getFromUserName());
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user