@Override public byte[] toBytes(final ActionCheckpoint state) { final StringBuilder data = new StringBuilder(); data.append(VERSION_V3).append(NEWLINE); data.append(state.getOffset()).append(NEWLINE); final Table<String, String, ConsumerGroupProgress> progresses = state.getProgresses(); for (final String subject : progresses.rowKeySet()) { final Map<String, ConsumerGroupProgress> groups = progresses.row(subject); data.append(SLASH_JOINER.join(subject, groups.size())).append(NEWLINE); for (final String group : groups.keySet()) { final ConsumerGroupProgress progress = groups.get(group); final Map<String, ConsumerProgress> consumers = progress.getConsumers(); final int consumerCount = consumers == null ? 0 : consumers.size(); data.append(SLASH_JOINER.join(group, boolean2Short(progress.isBroadcast()), progress.getPull(), consumerCount)).append(NEWLINE); if (consumerCount <= 0) { continue; } consumers.values().forEach(consumer -> { data.append(SLASH_JOINER.join(consumer.getConsumerId(), consumer.getPull(), consumer.getAck())).append(NEWLINE); }); } } return data.toString().getBytes(Charsets.UTF_8); }
private void initSubscribers() { final Collection<ConsumerGroupProgress> progresses = storage.allConsumerGroupProgresses(); progresses.forEach(progress -> { if (progress.isBroadcast()) { return; } progress.getConsumers().values().forEach(consumer -> { final String groupAndSubject = GroupAndSubject.groupAndSubject(consumer.getSubject(), consumer.getGroup()); addSubscriber(groupAndSubject, consumer.getConsumerId()); }); }); }
private ActionCheckpoint duplicateActionCheckpoint() { actionCheckpointGuard.lock(); try { final Table<String, String, ConsumerGroupProgress> progresses = HashBasedTable.create(); for (final ConsumerGroupProgress progress : actionCheckpoint.getProgresses().values()) { final Map<String, ConsumerProgress> consumers = progress.getConsumers(); if (consumers == null) { continue; } final Map<String, ConsumerProgress> consumersCopy = new HashMap<>(); for (final ConsumerProgress consumer : consumers.values()) { consumersCopy.put(consumer.getConsumerId(), new ConsumerProgress(consumer)); } final String subject = progress.getSubject(); final String group = progress.getGroup(); progresses.put(subject, group, new ConsumerGroupProgress(subject, group, progress.isBroadcast(), progress.getPull(), consumersCopy)); } final long offset = actionCheckpoint.getOffset(); return new ActionCheckpoint(offset, progresses); } finally { actionCheckpointGuard.unlock(); } }