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); }