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 logTimes(List<PulledMessage> pulledMessages) { for (PulledMessage pulledMessage : pulledMessages) { int times = pulledMessage.times(); if (times > MAX_MESSAGE_RETRY_THRESHOLD) { LOGGER.warn("这是第 {} 次收到同一条消息,请注意检查逻辑是否有问题. subject={}, msgId={}", times, RetrySubjectUtils.getRealSubject(pulledMessage.getSubject()), pulledMessage.getMessageId()); } } }
public PullConsumer getOrCreateDefault(String subject, String group, boolean isBroadcast) { final String realSubject = RetrySubjectUtils.getRealSubject(subject); final String key = MapKeyBuilder.buildSubscribeKey(realSubject, group); PullConsumer consumer = pullConsumerMap.get(key); if (consumer != null) { return consumer; } pullConsumerMapLock.lock(); try { consumer = pullConsumerMap.get(key); if (consumer != null) { return consumer; } PullConsumer consumerImpl = createDefaultPullConsumer(realSubject, group, isBroadcast); pullConsumerMap.put(key, consumerImpl); return consumerImpl; } catch (Exception e) { if (e instanceof DuplicateListenerException) { throw new CreatePullConsumerException("已经使用了onMessage方式处理的主题不能再纯拉模式", realSubject, group); } throw e; } finally { pullConsumerMapLock.unlock(); } }
public void heartbeat(String consumerId, String subject, String group) { final String realSubject = RetrySubjectUtils.getRealSubject(subject); final String retrySubject = RetrySubjectUtils.buildRetrySubject(realSubject, group); refreshSubscriber(realSubject, group, consumerId); refreshSubscriber(retrySubject, group, consumerId); }
private synchronized void changeOnOffline(String subject, String group, boolean isOnline, StatusSource src) { final String realSubject = RetrySubjectUtils.getRealSubject(subject); final String retrySubject = RetrySubjectUtils.buildRetrySubject(realSubject, group); final String key = MapKeyBuilder.buildSubscribeKey(realSubject, group); final PullEntry pullEntry = pullEntryMap.get(key); changeOnOffline(pullEntry, isOnline, src); final PullEntry retryPullEntry = pullEntryMap.get(MapKeyBuilder.buildSubscribeKey(retrySubject, group)); changeOnOffline(retryPullEntry, isOnline, src); final DefaultPullConsumer pullConsumer = pullConsumerMap.get(key); if (pullConsumer == null) return; if (isOnline) { pullConsumer.online(src); } else { pullConsumer.offline(src); } }
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 handleResponse(final Datagram response) { final short responseCode = response.getHeader().getCode(); if (responseCode == CommandCode.NO_MESSAGE) { callback.onCompleted(responseCode, Collections.<BaseMessage>emptyList()); } else if (responseCode != CommandCode.SUCCESS) { monitorPullError(request.getSubject(), request.getGroup()); callback.onCompleted(responseCode, Collections.<BaseMessage>emptyList()); } else { List<BaseMessage> messages = deserializeBaseMessage(response.getBody()); if (messages == null) { messages = Collections.emptyList(); } monitorPullCount(request.getSubject(), request.getGroup(), messages.size()); for (BaseMessage message : messages) { if (message.getMaxRetryNum() < 0) { String realSubject = RetrySubjectUtils.getRealSubject(message.getSubject()); message.setMaxRetryNum(PullSubjectsConfig.get().getMaxRetryNum(realSubject).get()); } } callback.onCompleted(responseCode, messages); } }
private MetaInfoResponse handleClientRegister(final MetaInfoRequest request) { final String realSubject = RetrySubjectUtils.getRealSubject(request.getSubject()); final int clientRequestType = request.getRequestType(); try { if (ClientRequestType.ONLINE.getCode() == clientRequestType) { store.insertClientMetaInfo(request); } final List<BrokerGroup> brokerGroups = subjectRouter.route(realSubject, request); List<BrokerGroup> removedReadonlyGroups = readonlyBrokerGroupManager.disableReadonlyBrokerGroup(realSubject, request.getClientTypeCode(), brokerGroups); final List<BrokerGroup> filteredBrokerGroups = filterBrokerGroups(removedReadonlyGroups); final OnOfflineState clientState = offlineStateManager.queryClientState(request.getClientId(), request.getSubject(), request.getConsumerGroup()); ClientLogUtils.log(realSubject, "client register response, request:{}, realSubject:{}, brokerGroups:{}, clientState:{}", request, realSubject, filteredBrokerGroups, clientState); return buildResponse(request, offlineStateManager.getLastUpdateTimestamp(), clientState, new BrokerCluster(filteredBrokerGroups)); } catch (Exception e) { LOG.error("process exception. {}", request, e); return buildResponse(request, -2, OnOfflineState.OFFLINE, new BrokerCluster(new ArrayList<>())); } }