(), namedThreadFactory);
this.sessionManager = new StandardSessionManager();
this.exceptionHandler = new LogExceptionHandler();
- }
-
- /**
- *
- * 设置自定义的 {@link ExecutorService}
- * 如果不调用该方法,默认使用 Executors.newFixedThreadPool(100)
- *
- */
- public void setExecutorService(ExecutorService executorService) {
- this.executorService = executorService;
- }
-
- /**
- *
- * 设置自定义的{@link me.chanjar.weixin.common.session.WxSessionManager}
- * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.session.StandardSessionManager}
- *
- */
- public void setSessionManager(WxSessionManager sessionManager) {
- this.sessionManager = sessionManager;
- }
-
- /**
- *
- * 设置自定义的{@link me.chanjar.weixin.common.api.WxErrorExceptionHandler}
- * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.util.LogExceptionHandler}
- *
- */
- public void setExceptionHandler(WxErrorExceptionHandler exceptionHandler) {
- this.exceptionHandler = exceptionHandler;
- }
-
- List getRules() {
- return this.rules;
+ this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker();
}
/**
@@ -90,6 +62,11 @@ public WxMaMessageRouterRule rule() {
* 处理微信消息.
*/
private WxMaXmlOutMessage route(final WxMaMessage wxMessage, final Map context) {
+ if (isMsgDuplicated(wxMessage)) {
+ // 如果是重复消息,那么就不做处理
+ return null;
+ }
+
final List matchRules = new ArrayList<>();
// 收集匹配的规则
for (final WxMaMessageRouterRule rule : this.rules) {
@@ -147,7 +124,26 @@ public void run() {
}
public WxMaXmlOutMessage route(final WxMaMessage wxMessage) {
- return this.route(wxMessage, new HashMap(2));
+ return this.route(wxMessage, new HashMap(2));
+ }
+
+ private boolean isMsgDuplicated(WxMaMessage wxMessage) {
+ StringBuilder messageId = new StringBuilder();
+ if (wxMessage.getMsgId() == null) {
+ messageId.append(wxMessage.getCreateTime())
+ .append("-").append(wxMessage.getFromUser())
+ .append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent()));
+ } else {
+ messageId.append(wxMessage.getMsgId())
+ .append("-").append(wxMessage.getCreateTime())
+ .append("-").append(wxMessage.getFromUser());
+ }
+
+ if (StringUtils.isNotEmpty(wxMessage.getToUser())) {
+ messageId.append("-").append(wxMessage.getToUser());
+ }
+
+ return this.messageDuplicateChecker.isDuplicate(messageId.toString());
}
/**