<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.11</artifactId>
<version>0.11.0.0</version>
</dependency>
@Service
@Slf4j
public class KafkaListenerServiceImpl implements KafkaListenerService {
@Value("${spring.kafka.consumer.bootstrap-servers}")
private String servers;
@Override
public Set<String> getAllGroupId(String servers) {
String[] serversArgs = servers.split(",");
Set<String> groupIds = new HashSet<>();
for (String server : serversArgs) {
AdminClient client = AdminClient.createSimplePlaintext(server);
try {
List<GroupOverview> allGroups = JavaConversions.seqAsJavaList(client.listAllGroupsFlattened().toSeq());
allGroups.forEach(group -> {
groupIds.add(group.groupId());
});
} finally {
client.close();
}
}
return groupIds;
}
@Override
public List<KafkaConsumerDTO> getConsumerDetails(String groupId) {
List<KafkaConsumerDTO> kafkaConsumerDtoS = Lists.newArrayList();
String[] serversArgs = servers.split(",");
for (String server : serversArgs) {
AdminClient client = AdminClient.createSimplePlaintext(server);
String broker = server.substring(0, server.indexOf(":"));
int port = Integer.parseInt(server.substring(server.indexOf(":") + 1));
try {
Map<TopicPartition, Object> offsets = JavaConversions.mapAsJavaMap(client.listGroupOffsets(groupId));
for (TopicPartition topicPartition : offsets.keySet()) {
String topic = topicPartition.topic();
int partition = topicPartition.partition();
Object currentOffset = offsets.get(topicPartition);
KafkaConsumerDTO kafkaConsumerDTO = new KafkaConsumerDTO();
kafkaConsumerDTO.setGroupId(groupId);
kafkaConsumerDTO.setTopic(topic);
kafkaConsumerDTO.setPartition(partition);
kafkaConsumerDTO.setCurrentOffset((Long) currentOffset);
String clientName = "Client_" + topic + "_" + partition;
SimpleConsumer consumer = new SimpleConsumer(broker, port, 100000, 64 * 1024, clientName);
long logEndOffset = getLastOffset(consumer, topic, partition, OffsetRequest.LatestTime(), clientName);
if (logEndOffset != 0){
kafkaConsumerDTO.setLogEndOffset(logEndOffset);
kafkaConsumerDTO.setLag(logEndOffset - kafkaConsumerDTO.getCurrentOffset());
kafkaConsumerDTO.setHost(broker);
kafkaConsumerDtoS.add(kafkaConsumerDTO);
}
}
} finally {
client.close();
}
}
return kafkaConsumerDtoS;
}
private static long getLastOffset(SimpleConsumer consumer, String topic, int partition, long whichTime, String clientName) {
TopicAndPartition topicAndPartition = new TopicAndPartition(topic, partition);
Map<TopicAndPartition, PartitionOffsetRequestInfo> requestInfo = new HashMap<>();
requestInfo.put(topicAndPartition, new PartitionOffsetRequestInfo(whichTime, 1));
kafka.javaapi.OffsetRequest request = new kafka.javaapi.OffsetRequest(requestInfo, kafka.api.OffsetRequest.CurrentVersion(), clientName);
OffsetResponse response = consumer.getOffsetsBefore(request);
if (response.hasError()) {
return 0;
}
long[] offsets = response.offsets(topic, partition);
return offsets[0];
}
}