| @@ -3,6 +3,7 @@ package cn.binarywang.wx.miniapp.message; | |||
| import cn.binarywang.wx.miniapp.api.WxMaService; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaMessage; | |||
| import com.google.common.util.concurrent.ThreadFactoryBuilder; | |||
| import lombok.Data; | |||
| import me.chanjar.weixin.common.api.WxErrorExceptionHandler; | |||
| import me.chanjar.weixin.common.api.WxMessageDuplicateChecker; | |||
| import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker; | |||
| @@ -11,6 +12,7 @@ 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 org.apache.commons.lang3.StringUtils; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| @@ -23,6 +25,7 @@ import java.util.concurrent.*; | |||
| /** | |||
| * @author <a href="https://github.com/binarywang">Binary Wang</a> | |||
| */ | |||
| @Data | |||
| public class WxMaMessageRouter { | |||
| private static final int DEFAULT_THREAD_POOL_SIZE = 100; | |||
| private final Logger log = LoggerFactory.getLogger(WxMaMessageRouter.class); | |||
| @@ -36,6 +39,8 @@ public class WxMaMessageRouter { | |||
| private WxErrorExceptionHandler exceptionHandler; | |||
| private WxMessageDuplicateChecker messageDuplicateChecker; | |||
| public WxMaMessageRouter(WxMaService wxMaService) { | |||
| this.wxMaService = wxMaService; | |||
| ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("WxMaMessageRouter-pool-%d").build(); | |||
| @@ -43,40 +48,7 @@ public class WxMaMessageRouter { | |||
| 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), namedThreadFactory); | |||
| this.sessionManager = new StandardSessionManager(); | |||
| this.exceptionHandler = new LogExceptionHandler(); | |||
| } | |||
| /** | |||
| * <pre> | |||
| * 设置自定义的 {@link ExecutorService} | |||
| * 如果不调用该方法,默认使用 Executors.newFixedThreadPool(100) | |||
| * </pre> | |||
| */ | |||
| public void setExecutorService(ExecutorService executorService) { | |||
| this.executorService = executorService; | |||
| } | |||
| /** | |||
| * <pre> | |||
| * 设置自定义的{@link me.chanjar.weixin.common.session.WxSessionManager} | |||
| * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.session.StandardSessionManager} | |||
| * </pre> | |||
| */ | |||
| public void setSessionManager(WxSessionManager sessionManager) { | |||
| this.sessionManager = sessionManager; | |||
| } | |||
| /** | |||
| * <pre> | |||
| * 设置自定义的{@link me.chanjar.weixin.common.api.WxErrorExceptionHandler} | |||
| * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.util.LogExceptionHandler} | |||
| * </pre> | |||
| */ | |||
| public void setExceptionHandler(WxErrorExceptionHandler exceptionHandler) { | |||
| this.exceptionHandler = exceptionHandler; | |||
| } | |||
| List<WxMaMessageRouterRule> getRules() { | |||
| return this.rules; | |||
| this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker(); | |||
| } | |||
| /** | |||
| @@ -90,6 +62,11 @@ public class WxMaMessageRouter { | |||
| * 处理微信消息. | |||
| */ | |||
| private WxMaXmlOutMessage route(final WxMaMessage wxMessage, final Map<String, Object> context) { | |||
| if (isMsgDuplicated(wxMessage)) { | |||
| // 如果是重复消息,那么就不做处理 | |||
| return null; | |||
| } | |||
| final List<WxMaMessageRouterRule> matchRules = new ArrayList<>(); | |||
| // 收集匹配的规则 | |||
| for (final WxMaMessageRouterRule rule : this.rules) { | |||
| @@ -147,7 +124,26 @@ public class WxMaMessageRouter { | |||
| } | |||
| public WxMaXmlOutMessage route(final WxMaMessage wxMessage) { | |||
| return this.route(wxMessage, new HashMap<String, Object>(2)); | |||
| return this.route(wxMessage, new HashMap<String, Object>(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()); | |||
| } | |||
| /** | |||