public static Optional<String> getSubject(final String retrySubject) { if (!isRetrySubject(retrySubject) && !isDeadRetrySubject(retrySubject)) { return Optional.absent(); } final List<String> parts = RETRY_SUBJECT_SPLITTER.splitToList(retrySubject); if (parts.size() != 3) { return Optional.absent(); } else { return Optional.of(parts.get(1)); } }
public static String[] parseSubjectAndGroup(String subject) { if (!isRetrySubject(subject) && !isDeadRetrySubject(subject)) { return null; } final List<String> parts = RETRY_SUBJECT_SPLITTER.splitToList(subject); if (parts.size() != 3) { return null; } else { return new String[]{parts.get(1), parts.get(2)}; } } }
public static boolean isRealSubject(final String subject) { return !Strings.isNullOrEmpty(subject) && !isRetrySubject(subject) && !isDeadRetrySubject(subject); }
public ConsumeParam(String subject, String group, boolean isBroadcast, boolean isConsumeMostOnce, TagType tagType, Set<String> tags, String clientId) { this.subject = subject; this.group = group; this.originSubject = RetrySubjectUtils.isRetrySubject(subject) ? RetrySubjectUtils.getRealSubject(subject) : subject; this.retrySubject = RetrySubjectUtils.buildRetrySubject(originSubject, group); this.consumerId = clientId; this.isBroadcast = isBroadcast; this.isConsumeMostOnce = isConsumeMostOnce; this.tagType = tagType; this.tags = tags; }
private void monitorMessageReceived(long receiveTime, String subject) { if (RetrySubjectUtils.isRetrySubject(subject) || RetrySubjectUtils.isDeadRetrySubject(subject)) { QMon.receivedRetryMessagesCountInc(subject); } QMon.receivedMessagesCountInc(subject); QMon.produceTime(subject, System.currentTimeMillis() - receiveTime); }
public synchronized GetMessageResult pollMessages(final int maxMessages) { enableLagMonitor(); long currentSequence = nextSequence.get(); if (RetrySubjectUtils.isRetrySubject(subject)) { return storage.pollMessages(subject, currentSequence, maxMessages, this::isDelayReached); } else { final GetMessageResult result = storage.pollMessages(subject, currentSequence, maxMessages); long actualSequence = result.getNextBeginOffset() - result.getSegmentBuffers().size(); long delta = actualSequence - currentSequence; if (delta > 0) { QMon.expiredMessagesCountInc(subject, group, delta); LOG.error("next sequence skipped. subject: {}, group: {}, nextSequence: {}, result: {}", subject, group, currentSequence, result); } return result; } }
private void putNeedRetryMessages(String subject, String group, String consumerId, List<SegmentBuffer> needRetryMessages) { try { for (SegmentBuffer buffer : needRetryMessages) { final ByteBuf message = Unpooled.wrappedBuffer(buffer.getBuffer()); final RawMessage rawMessage = QMQSerializer.deserializeRawMessage(message); if (!RetrySubjectUtils.isRetrySubject(subject)) { final String retrySubject = RetrySubjectUtils.buildRetrySubject(subject, group); rawMessage.setSubject(retrySubject); } final PutMessageResult putMessageResult = storage.appendMessage(rawMessage); if (putMessageResult.getStatus() != PutMessageStatus.SUCCESS) { LOG.error("put message error, consumer:{} {} {}, status:{}", subject, group, consumerId, putMessageResult.getStatus()); throw new RuntimeException("put retry message error"); } } } finally { needRetryMessages.forEach(SegmentBuffer::release); } QMon.putNeedRetryMessagesCountInc(subject, group, needRetryMessages.size()); }
AckSendQueue(String brokerGroupName, String subject, String group, AckService ackService, BrokerService brokerService, SendMessageBack sendMessageBack, boolean isBroadcast) { this.brokerGroupName = brokerGroupName; this.subject = subject; this.group = group; this.ackService = ackService; this.brokerService = brokerService; this.sendMessageBack = sendMessageBack; this.isBroadcast = isBroadcast; String realSubject = RetrySubjectUtils.isRetrySubject(subject) ? RetrySubjectUtils.getRealSubject(subject) : subject; this.retrySubject = RetrySubjectUtils.buildRetrySubject(realSubject, group); this.deadRetrySubject = RetrySubjectUtils.buildDeadRetrySubject(realSubject, group); this.pullBatchSize = PullSubjectsConfig.get().getPullBatchSize(subject); }
private void monitorMessageReceived(long receiveTime, String subject) { if (RetrySubjectUtils.isRetrySubject(subject)) { String[] subjectAndGroup = RetrySubjectUtils.parseSubjectAndGroup(subject); if (subjectAndGroup == null || subjectAndGroup.length != 2) return; QMon.consumerErrorCount(subjectAndGroup[0], subjectAndGroup[1]); return; } if (RetrySubjectUtils.isDeadRetrySubject(subject)) { String[] subjectAndGroup = RetrySubjectUtils.parseSubjectAndGroup(subject); if (subjectAndGroup == null || subjectAndGroup.length != 2) return; QMon.consumerErrorCount(subjectAndGroup[0], subjectAndGroup[1]); QMon.deadLetterQueueCount(subjectAndGroup[0], subjectAndGroup[1]); return; } QMon.receivedMessagesCountInc(subject); QMon.produceTime(subject, System.currentTimeMillis() - receiveTime); }