Skip to content

Commit d18b66c

Browse files
committed
issue binarywang#69 添加Session的支持
1 parent 7184711 commit d18b66c

File tree

19 files changed

+320
-69
lines changed

19 files changed

+320
-69
lines changed

weixin-java-common/src/main/java/me/chanjar/weixin/common/session/SessionManagerImpl.java renamed to weixin-java-common/src/main/java/me/chanjar/weixin/common/session/InMemorySessionManager.java

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
import java.util.concurrent.ConcurrentHashMap;
99
import java.util.concurrent.atomic.AtomicBoolean;
1010

11-
public class SessionManagerImpl implements WxSessionManager, InternalSessionManager {
11+
public class InMemorySessionManager implements WxSessionManager, InternalSessionManager {
1212

13-
protected final Logger log = LoggerFactory.getLogger(SessionManagerImpl.class);
13+
protected final Logger log = LoggerFactory.getLogger(InMemorySessionManager.class);
1414

1515
protected static final StringManager sm =
1616
StringManager.getManager(Constants.Package);
@@ -105,6 +105,11 @@ public WxSession getSession(String sessionId, boolean create) {
105105
*/
106106
protected int processExpiresFrequency = 6;
107107

108+
/**
109+
* background processor delay in seconds
110+
*/
111+
protected int backgroundProcessorDelay = 10;
112+
108113
/**
109114
* 后台清理线程是否已经开启
110115
*/
@@ -204,7 +209,7 @@ public void run() {
204209
while (true) {
205210
try {
206211
// 每秒清理一次
207-
Thread.sleep(1000l);
212+
Thread.sleep(backgroundProcessorDelay * 1000l);
208213
backgroundProcess();
209214
} catch (InterruptedException e) {
210215
log.error("SessionManagerImpl.backgroundProcess error", e);
@@ -225,6 +230,7 @@ public void run() {
225230
}
226231
}
227232
}
233+
228234
}
229235

230236
/**
@@ -269,6 +275,34 @@ public void processExpires() {
269275
}
270276

271277

278+
@Override
279+
public void setMaxInactiveInterval(int interval) {
280+
281+
this.maxInactiveInterval = interval;
282+
283+
}
284+
285+
/**
286+
* Set the manager checks frequency.
287+
*
288+
* @param processExpiresFrequency the new manager checks frequency
289+
*/
290+
@Override
291+
public void setProcessExpiresFrequency(int processExpiresFrequency) {
292+
293+
if (processExpiresFrequency <= 0) {
294+
return;
295+
}
296+
297+
this.processExpiresFrequency = processExpiresFrequency;
298+
299+
}
300+
301+
@Override
302+
public void setBackgroundProcessorDelay(int backgroundProcessorDelay) {
303+
this.backgroundProcessorDelay = backgroundProcessorDelay;
304+
}
305+
272306
/**
273307
* Return the descriptive short name of this Manager implementation.
274308
*/

weixin-java-common/src/main/java/me/chanjar/weixin/common/session/InternalSessionFacade.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class InternalSessionFacade implements WxSession {
1010
private WxSession session = null;
1111

1212
public InternalSessionFacade(WxSession session) {
13-
session = session;
13+
this.session = session;
1414
}
1515

1616
@Override

weixin-java-common/src/main/java/me/chanjar/weixin/common/session/InternalSessionManager.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,15 @@ public interface InternalSessionManager {
6060
*/
6161
public void backgroundProcess();
6262

63+
/**
64+
* Set the default maximum inactive interval (in seconds)
65+
* for Sessions created by this Manager.
66+
*
67+
* @param interval The new default value
68+
*/
69+
void setMaxInactiveInterval(int interval);
70+
71+
void setProcessExpiresFrequency(int processExpiresFrequency);
72+
73+
void setBackgroundProcessorDelay(int backgroundProcessorDelay);
6374
}

weixin-java-common/src/main/java/me/chanjar/weixin/common/session/SessionImpl.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,4 +308,40 @@ protected String[] keys() {
308308

309309
}
310310

311+
@Override
312+
public boolean equals(Object o) {
313+
if (this == o) return true;
314+
if (!(o instanceof SessionImpl)) return false;
315+
316+
SessionImpl session = (SessionImpl) o;
317+
318+
if (creationTime != session.creationTime) return false;
319+
if (expiring != session.expiring) return false;
320+
if (isValid != session.isValid) return false;
321+
if (maxInactiveInterval != session.maxInactiveInterval) return false;
322+
if (thisAccessedTime != session.thisAccessedTime) return false;
323+
if (!accessCount.equals(session.accessCount)) return false;
324+
if (!attributes.equals(session.attributes)) return false;
325+
if (!facade.equals(session.facade)) return false;
326+
if (!id.equals(session.id)) return false;
327+
if (!manager.equals(session.manager)) return false;
328+
329+
return true;
330+
}
331+
332+
@Override
333+
public int hashCode() {
334+
int result = attributes.hashCode();
335+
result = 31 * result + id.hashCode();
336+
result = 31 * result + (isValid ? 1 : 0);
337+
result = 31 * result + (expiring ? 1 : 0);
338+
result = 31 * result + manager.hashCode();
339+
result = 31 * result + (int) (creationTime ^ (creationTime >>> 32));
340+
result = 31 * result + (int) (thisAccessedTime ^ (thisAccessedTime >>> 32));
341+
result = 31 * result + maxInactiveInterval;
342+
result = 31 * result + facade.hashCode();
343+
result = 31 * result + accessCount.hashCode();
344+
return result;
345+
}
346+
311347
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package me.chanjar.weixin.common.session;
2+
3+
import org.testng.Assert;
4+
import org.testng.annotations.DataProvider;
5+
import org.testng.annotations.Test;
6+
7+
@Test
8+
public class TestSession {
9+
10+
@DataProvider
11+
public Object[][] getSessionManager() {
12+
return new Object[][] {
13+
new Object[] { new InMemorySessionManager() }
14+
};
15+
}
16+
17+
18+
@Test(dataProvider = "getSessionManager", expectedExceptions = IllegalStateException.class)
19+
public void testInvalidate(WxSessionManager sessionManager) {
20+
WxSession session = sessionManager.getSession("abc");
21+
session.invalidate();
22+
session.getAttributeNames();
23+
}
24+
25+
@Test(dataProvider = "getSessionManager")
26+
public void testInvalidate2(InternalSessionManager sessionManager) {
27+
Assert.assertEquals(sessionManager.getActiveSessions(), 0);
28+
WxSession session = ((WxSessionManager) sessionManager).getSession("abc");
29+
Assert.assertEquals(sessionManager.getActiveSessions(), 1);
30+
session.invalidate();
31+
Assert.assertEquals(sessionManager.getActiveSessions(), 0);
32+
}
33+
34+
@Test(dataProvider = "getSessionManager")
35+
public void testGetSession(WxSessionManager sessionManager) {
36+
WxSession session1 = sessionManager.getSession("abc");
37+
WxSession session2 = sessionManager.getSession("abc");
38+
Assert.assertTrue(session1.equals(session2));
39+
40+
WxSession abc1 = sessionManager.getSession("abc1");
41+
Assert.assertFalse(session1.equals(abc1));
42+
43+
WxSession abc1b = sessionManager.getSession("abc1", false);
44+
Assert.assertTrue(abc1.equals(abc1b));
45+
46+
WxSession def = sessionManager.getSession("def", false);
47+
Assert.assertNull(def);
48+
}
49+
50+
@Test(dataProvider = "getSessionManager")
51+
public void testBackgroundProcess(WxSessionManager sessionManager) throws InterruptedException {
52+
53+
InternalSessionManager ism = (InternalSessionManager) sessionManager;
54+
ism.setMaxInactiveInterval(1);
55+
ism.setProcessExpiresFrequency(1);
56+
ism.setBackgroundProcessorDelay(1);
57+
58+
Assert.assertEquals(ism.getActiveSessions(), 0);
59+
60+
InternalSession abc = ism.createSession("abc");
61+
abc.endAccess();
62+
63+
Thread.sleep(2000l);
64+
Assert.assertEquals(ism.getActiveSessions(), 0);
65+
66+
}
67+
68+
}

weixin-java-common/src/test/resources/testng.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<class name="me.chanjar.weixin.common.bean.WxMenuTest"/>
99
<class name="me.chanjar.weixin.common.util.crypto.WxCryptUtilTest"/>
1010
<class name="me.chanjar.weixin.common.util.WxMessageInMemoryDuplicateCheckerTest"/>
11+
<class name="me.chanjar.weixin.common.session.TestSession" />
1112
</classes>
1213
</test>
1314
</suite>
Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
11
package me.chanjar.weixin.cp.api;
22

3+
import me.chanjar.weixin.common.session.WxSessionManager;
34
import me.chanjar.weixin.cp.bean.WxCpXmlMessage;
45
import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage;
56

67
import java.util.Map;
78

89
/**
910
* 处理微信推送消息的处理器接口
10-
* @author Daniel Qian
1111
*
12+
* @author Daniel Qian
1213
*/
1314
public interface WxCpMessageHandler {
1415

1516
/**
16-
*
1717
* @param wxMessage
18-
* @param context 上下文,如果handler或interceptor之间有信息要传递,可以用这个
18+
* @param context 上下文,如果handler或interceptor之间有信息要传递,可以用这个
1919
* @param wxCpService
20+
* @param sessionManager
2021
* @return xml格式的消息,如果在异步规则里处理的话,可以返回null
2122
*/
22-
public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService wxCpService);
23-
23+
public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage,
24+
Map<String, Object> context,
25+
WxCpService wxCpService,
26+
WxSessionManager sessionManager);
27+
2428
}
Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,29 @@
11
package me.chanjar.weixin.cp.api;
22

3+
import me.chanjar.weixin.common.session.WxSessionManager;
34
import me.chanjar.weixin.cp.bean.WxCpXmlMessage;
45

56
import java.util.Map;
67

78
/**
89
* 微信消息拦截器,可以用来做验证
9-
* @author Daniel Qian
1010
*
11+
* @author Daniel Qian
1112
*/
1213
public interface WxCpMessageInterceptor {
1314

1415
/**
1516
* 拦截微信消息
17+
*
1618
* @param wxMessage
17-
* @param context 上下文,如果handler或interceptor之间有信息要传递,可以用这个
19+
* @param context 上下文,如果handler或interceptor之间有信息要传递,可以用这个
1820
* @param wxCpService
19-
* @return true代表OK,false代表不OK
21+
* @param sessionManager
22+
* @return true代表OK,false代表不OK
2023
*/
21-
public boolean intercept(WxCpXmlMessage wxMessage, Map<String, Object> context, WxCpService wxCpService);
22-
24+
public boolean intercept(WxCpXmlMessage wxMessage,
25+
Map<String, Object> context,
26+
WxCpService wxCpService,
27+
WxSessionManager sessionManager);
28+
2329
}

0 commit comments

Comments
 (0)