Kafka之获取指定Topic-Partition的Leader

前言

  • kafka版本:2.11-2.1.1
  • 基于Kafka Java API
  • 主要是通过封装Consumer.partitionsFor方法实现此功能

代码

/**
     * <p>
     * 用于寻找指定Brokers-Topic-Partition对应的Leader.
     * 主要是封装了{@link KafkaConsumer#partitionsFor}方法.
     *
     * @param brokers   指定的Kafka集群,格式为<"host","port">
     * @param topic     指定的Topic
     * @param partition 指定的Partition ID
     * @return Node {@link Node}
     * @date 2020/3/17
     */
    public static Node findLeader(Map<String, Integer> brokers, String topic, int partition) {
        // 1.通过接收到的配置信息创建KafkaConsumer实例
        Properties props = new Properties();
        for (String broker : brokers.keySet()) {
            props.put("bootstrap.servers",
                    broker + ":" + brokers.getOrDefault(broker, 9092));
        }
        // 指定Consumer所属的ConsumerGroup
        props.put("group.id", "test");
        // 设置手动提交Offset,由于只是获取部分数据所以不需要自动提交Offset
        props.put("enable.auto.commit", "false");
        // 设置键值对<K,V>反序列化器,使用String对象反序列化器
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        // 2.定义KafkaConsumer实例,采用try{}catch{}finally{}的方式获取资源
        KafkaConsumer<String, String> kafkaConsumer = null;
        try {
            // 3.创建KafkaConsumer实例
            kafkaConsumer = new KafkaConsumer<>(props);
            // 4.通过KafkaConsumer实例获取指定Topic对应的Partition信息
            List<PartitionInfo> partitionInfos = kafkaConsumer.partitionsFor(topic);
            // 5.遍历返回的指定Topic的所有Partition信息
            for (PartitionInfo partitionInfo : partitionInfos) {
                // 若当前Partition是指定的Partition,则保存此Partition的Replication并将其Leader返回
                if (partitionInfo.partition() == partition) {
                    /*// 保存指定Partition的所有副本
                    replications = partitionInfo.replicas();*/
                    // 6.返回指定的TopicPartition对应的Leader
                    return partitionInfo.leader();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (kafkaConsumer != null) kafkaConsumer.close();
        }
        // 如果没有找到Leader则返回null
        return null;
    }

End~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值