|
|
@@ -1,9 +1,6 @@ |
|
|
|
package me.chanjar.weixin.cp.message; |
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.*; |
|
|
|
import java.util.concurrent.ExecutionException; |
|
|
|
import java.util.concurrent.ExecutorService; |
|
|
|
import java.util.concurrent.Executors; |
|
|
@@ -18,7 +15,6 @@ import me.chanjar.weixin.common.api.WxMessageDuplicateChecker; |
|
|
|
import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker; |
|
|
|
import me.chanjar.weixin.common.session.InternalSession; |
|
|
|
import me.chanjar.weixin.common.session.InternalSessionManager; |
|
|
|
import me.chanjar.weixin.common.session.StandardSessionManager; |
|
|
|
import me.chanjar.weixin.common.session.WxSessionManager; |
|
|
|
import me.chanjar.weixin.common.util.LogExceptionHandler; |
|
|
|
import me.chanjar.weixin.cp.api.WxCpService; |
|
|
@@ -54,9 +50,8 @@ import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; |
|
|
|
* @author Daniel Qian |
|
|
|
*/ |
|
|
|
public class WxCpMessageRouter { |
|
|
|
|
|
|
|
private static final int DEFAULT_THREAD_POOL_SIZE = 100; |
|
|
|
protected final Logger log = LoggerFactory.getLogger(WxCpMessageRouter.class); |
|
|
|
private final Logger log = LoggerFactory.getLogger(WxCpMessageRouter.class); |
|
|
|
private final List<WxCpMessageRouterRule> rules = new ArrayList<>(); |
|
|
|
|
|
|
|
private final WxCpService wxCpService; |
|
|
@@ -69,6 +64,9 @@ public class WxCpMessageRouter { |
|
|
|
|
|
|
|
private WxErrorExceptionHandler exceptionHandler; |
|
|
|
|
|
|
|
/** |
|
|
|
* 构造方法. |
|
|
|
*/ |
|
|
|
public WxCpMessageRouter(WxCpService wxCpService) { |
|
|
|
this.wxCpService = wxCpService; |
|
|
|
this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE); |
|
|
@@ -82,8 +80,6 @@ public class WxCpMessageRouter { |
|
|
|
* 设置自定义的 {@link ExecutorService} |
|
|
|
* 如果不调用该方法,默认使用 Executors.newFixedThreadPool(100) |
|
|
|
* </pre> |
|
|
|
* |
|
|
|
* @param executorService |
|
|
|
*/ |
|
|
|
public void setExecutorService(ExecutorService executorService) { |
|
|
|
this.executorService = executorService; |
|
|
@@ -94,8 +90,6 @@ public class WxCpMessageRouter { |
|
|
|
* 设置自定义的 {@link me.chanjar.weixin.common.api.WxMessageDuplicateChecker} |
|
|
|
* 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker} |
|
|
|
* </pre> |
|
|
|
* |
|
|
|
* @param messageDuplicateChecker |
|
|
|
*/ |
|
|
|
public void setMessageDuplicateChecker(WxMessageDuplicateChecker messageDuplicateChecker) { |
|
|
|
this.messageDuplicateChecker = messageDuplicateChecker; |
|
|
@@ -106,8 +100,6 @@ public class WxCpMessageRouter { |
|
|
|
* 设置自定义的{@link me.chanjar.weixin.common.session.WxSessionManager} |
|
|
|
* 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.session.StandardSessionManager} |
|
|
|
* </pre> |
|
|
|
* |
|
|
|
* @param sessionManager |
|
|
|
*/ |
|
|
|
public void setSessionManager(WxSessionManager sessionManager) { |
|
|
|
this.sessionManager = sessionManager; |
|
|
@@ -118,8 +110,6 @@ public class WxCpMessageRouter { |
|
|
|
* 设置自定义的{@link me.chanjar.weixin.common.api.WxErrorExceptionHandler} |
|
|
|
* 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.util.LogExceptionHandler} |
|
|
|
* </pre> |
|
|
|
* |
|
|
|
* @param exceptionHandler |
|
|
|
*/ |
|
|
|
public void setExceptionHandler(WxErrorExceptionHandler exceptionHandler) { |
|
|
|
this.exceptionHandler = exceptionHandler; |
|
|
@@ -130,20 +120,17 @@ public class WxCpMessageRouter { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 开始一个新的Route规则 |
|
|
|
* 开始一个新的Route规则. |
|
|
|
*/ |
|
|
|
public WxCpMessageRouterRule rule() { |
|
|
|
return new WxCpMessageRouterRule(this); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 处理微信消息 |
|
|
|
* |
|
|
|
* @param wxMessage |
|
|
|
* @param context |
|
|
|
* 处理微信消息. |
|
|
|
*/ |
|
|
|
public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map<String, Object> context) { |
|
|
|
if (isDuplicateMessage(wxMessage)) { |
|
|
|
private WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map<String, Object> context) { |
|
|
|
if (isMsgDuplicated(wxMessage)) { |
|
|
|
// 如果是重复消息,那么就不做处理 |
|
|
|
return null; |
|
|
|
} |
|
|
@@ -207,48 +194,43 @@ public class WxCpMessageRouter { |
|
|
|
return res; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 处理微信消息. |
|
|
|
* |
|
|
|
*/ |
|
|
|
public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage) { |
|
|
|
return this.route(wxMessage, new HashMap<String, Object>(2)); |
|
|
|
} |
|
|
|
|
|
|
|
protected boolean isDuplicateMessage(WxCpXmlMessage wxMessage) { |
|
|
|
String messageId; |
|
|
|
private boolean isMsgDuplicated(WxCpXmlMessage wxMessage) { |
|
|
|
StringBuilder messageId = new StringBuilder(); |
|
|
|
if (wxMessage.getMsgId() == null) { |
|
|
|
messageId = String.valueOf(wxMessage.getCreateTime()) |
|
|
|
+ "-" + StringUtils.trimToEmpty(String.valueOf(wxMessage.getAgentId())) |
|
|
|
+ "-" + wxMessage.getFromUserName() |
|
|
|
+ "-" + StringUtils.trimToEmpty(wxMessage.getEventKey()) |
|
|
|
+ "-" + StringUtils.trimToEmpty(wxMessage.getEvent()) |
|
|
|
; |
|
|
|
messageId.append(wxMessage.getCreateTime()) |
|
|
|
.append("-").append(StringUtils.trimToEmpty(String.valueOf(wxMessage.getAgentId()))) |
|
|
|
.append("-").append(wxMessage.getFromUserName()) |
|
|
|
.append("-").append(StringUtils.trimToEmpty(wxMessage.getEventKey())) |
|
|
|
.append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent())); |
|
|
|
} else { |
|
|
|
messageId = new StringBuilder().append(wxMessage.getMsgId()) |
|
|
|
messageId.append(wxMessage.getMsgId()) |
|
|
|
.append("-").append(wxMessage.getCreateTime()) |
|
|
|
.append("-").append(wxMessage.getFromUserName()) |
|
|
|
.toString(); |
|
|
|
.append("-").append(wxMessage.getFromUserName()); |
|
|
|
} |
|
|
|
|
|
|
|
if (StringUtils.isNotEmpty(wxMessage.getUserId())) { |
|
|
|
messageId.append("-").append(wxMessage.getUserId()); |
|
|
|
} |
|
|
|
|
|
|
|
return this.messageDuplicateChecker.isDuplicate(messageId); |
|
|
|
return this.messageDuplicateChecker.isDuplicate(messageId.toString()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 对session的访问结束 |
|
|
|
* |
|
|
|
* @param wxMessage |
|
|
|
* 对session的访问结束. |
|
|
|
*/ |
|
|
|
protected void sessionEndAccess(WxCpXmlMessage wxMessage) { |
|
|
|
|
|
|
|
private void sessionEndAccess(WxCpXmlMessage wxMessage) { |
|
|
|
InternalSession session = ((InternalSessionManager) this.sessionManager).findSession(wxMessage.getFromUserName()); |
|
|
|
if (session != null) { |
|
|
|
session.endAccess(); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |