docs: public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage) {
      if (isDuplicateMessage(wxMessage)) {
        // 如果是重复消息，那么就不做处理
        return null;
      }
  
      final List<WxCpMessageRouterRule> matchRules = new ArrayList<WxCpMessageRouterRule>();
      // 收集匹配的规则
      for (final WxCpMessageRouterRule rule : rules) {
        if (rule.test(wxMessage)) {
          matchRules.add(rule);
          if(!rule.isReEnter()) {
            break;
          }
        }
      }
  
      if (matchRules.size() == 0) {
        return null;
      }
  
      WxCpXmlOutMessage res = null;
      final List<Future> futures = new ArrayList<Future>();
      for (final WxCpMessageRouterRule rule : matchRules) {
        // 返回最后一个非异步的rule的执行结果
        if(rule.isAsync()) {
          futures.add(
              executorService.submit(new Runnable() {
                public void run() {
                  rule.service(wxMessage, wxCpService, sessionManager, exceptionHandler);
                }
              })
          );
        } else {
          res = rule.service(wxMessage, wxCpService, sessionManager, exceptionHandler);
          // 在同步操作结束，session访问结束
          log.debug("End session access: async=false, sessionId={}", wxMessage.getFromUserName());
          sessionEndAccess(wxMessage);
        }
      }
  
      if (futures.size() > 0) {
        executorService.submit(new Runnable() {
          @Override
          public void run() {
            for (Future future : futures) {
              try {
                future.get();
                log.debug("End session access: async=true, sessionId={}", 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);
              }
            }
          }
        });
      }
      return res;
    }