public void notifyMessageArriving(final String topic, final int queueId, final long offset) {
    String key = this.buildKey(topic, queueId);
    ManyPullRequest mpr = this.pullRequestTable.get(key);
    if (mpr != null) {
      List<PullRequest> requestList = mpr.cloneListAndClear();
      if (requestList != null) {
        List<PullRequest> replayList = new ArrayList<PullRequest>();

        for (PullRequest request : requestList) {
          // 查看是否offset OK
          if (offset >= request.getPullFromThisOffset()) {
            try {
              this.brokerController
                  .getPullMessageProcessor()
                  .excuteRequestWhenWakeup(request.getClientChannel(), request.getRequestCommand());
            } catch (RemotingCommandException e) {
              log.error("", e);
            }
            continue;
          }
          // 尝试取最新Offset
          else {
            final long newestOffset =
                this.brokerController.getMessageStore().getMaxOffsetInQuque(topic, queueId);
            if (newestOffset >= request.getPullFromThisOffset()) {
              try {
                this.brokerController
                    .getPullMessageProcessor()
                    .excuteRequestWhenWakeup(
                        request.getClientChannel(), request.getRequestCommand());
              } catch (RemotingCommandException e) {
                log.error("", e);
              }
              continue;
            }
          }

          // 查看是否超时
          if (System.currentTimeMillis()
              >= (request.getSuspendTimestamp() + request.getTimeoutMillis())) {
            try {
              this.brokerController
                  .getPullMessageProcessor()
                  .excuteRequestWhenWakeup(request.getClientChannel(), request.getRequestCommand());
            } catch (RemotingCommandException e) {
              log.error("", e);
            }
            continue;
          }

          // 当前不满足要求,重新放回Hold列表中
          replayList.add(request);
        }

        if (!replayList.isEmpty()) {
          mpr.addPullRequest(replayList);
        }
      }
    }
  }
  public void suspendPullRequest(
      final String topic, final int queueId, final PullRequest pullRequest) {
    String key = this.buildKey(topic, queueId);
    ManyPullRequest mpr = this.pullRequestTable.get(key);
    if (null == mpr) {
      mpr = new ManyPullRequest();
      ManyPullRequest prev = this.pullRequestTable.putIfAbsent(key, mpr);
      if (prev != null) {
        mpr = prev;
      }
    }

    mpr.addPullRequest(pullRequest);
  }