package com.tuoheng.common.config.kafka;

import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;

/**
 * kafka配置类
 *
 * @author 拓恒
 * @since 2022-03-07
 */
@Configuration
@Getter
@Setter
@ConditionalOnProperty(name = KafkaPropeties.SPRING_KAFKA_ENABLE, havingValue = KafkaPropeties.TRUE)
public class KafkaPropeties {

    public static final String SPRING_KAFKA_ENABLE = "spring.kafka.common.enable";

    public static final String TRUE = "true";
    /**
     * Kafka连接地址
     */
    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServersConfig;

    /**
     * 生产者发送消息响应方式， 默认 all(-1)
     */
    @Value("${spring.kafka.producer.acks:-1}")
    private String producerAckConfig;

    /**
     * 发送失败重试次数
     */
    @Value("${spring.kafka.producer.retries:3}")
    private Integer producerRetries;

    /**
     * 发送消息等待时间，默认设置：50,官方默认：0
     */
    @Value("${spring.kafka.producer.properties.linger.ms:50}")
    private Long producerLingerMs;

    /**
     * 幂等性开关
     */
    @Value("${spring.kafka.producer.properties.enable.idempotence:true}")
    private Boolean producerEnableIdempotence;

    /**
     * 事务前缀
     */
    @Value("${spring.kafka.producer.transaction-id-prefix:tran-}")
    private String producerTransactionIdPrefix;

    /**
     * 是否自动提交offset（true：自动提交；false：手动提交）
     */
    @Value("${spring.kafka.consumer.enable-auto-commit:false}")
    private Boolean consumerEnableAutoCommit;

    /**
     * 这个参数指定了当消费者第一次读取分区或者无offset时拉取那个位置的消息，可以取值为latest（从最新的消息开始消费），earliest（从最早的消息开始消费），none（如果无offset就抛出异常）
     */
    @Value("${spring.kafka.consumer.auto-offset-reset:latest}")
    private String consumerAutoOffsetReset;

    /**
     * 一次拉取条数
     */
    @Value("${spring.kafka.consumer.max-poll-records:1}")
    private Integer consumerMaxPollRecords;

    /**
     * 事务读取隔离级别，默认设置已提交读
     */
    @Value("${spring.kafka.consumer.isolation-level:read_committed}")
    private String isolationLevel;

    /**
     * 是否允许自动创建topic
     */
    @Value("${spring.kafka.auto.create.topics:false}")
    private Boolean autoCreateTopics;

}
