Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Kafka使用者未使用事务语义(isolation.level=read\u committed)_Java_Apache Kafka_Kafka Consumer Api_Kafka Producer Api - Fatal编程技术网

Java Kafka使用者未使用事务语义(isolation.level=read\u committed)

Java Kafka使用者未使用事务语义(isolation.level=read\u committed),java,apache-kafka,kafka-consumer-api,kafka-producer-api,Java,Apache Kafka,Kafka Consumer Api,Kafka Producer Api,当Kafka Consumer在属性中具有事务语义时,它无法使用任何消息。但是,当我删除该属性或更新该属性以读取\u uncommitted时,它会消耗消息 以下是我的卡夫卡消费者财产:- Properties props = new Properties(); props.put("bootstrap.servers", "10.2.200.15:9092"); String consumeGroup = "cg3"; props.put("group.id", con

当Kafka Consumer在属性中具有事务语义时,它无法使用任何消息。但是,当我删除该属性或更新该属性以读取\u uncommitted时,它会消耗消息

以下是我的卡夫卡消费者财产:-

Properties props = new Properties();
    props.put("bootstrap.servers", "10.2.200.15:9092");
    String consumeGroup = "cg3";
    props.put("group.id", consumeGroup);
    // Below is a key setting to turn off the auto commit.
    props.put("enable.auto.commit", "false");
    props.put("heartbeat.interval.ms", "2000");
    props.put("session.timeout.ms", "6001");
    // Control maximum data on each poll, make sure this value is bigger than the
    // maximum // single message size
    props.put("max.partition.fetch.bytes", "140");
    props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("isolation.level","read_committed");
Kafka Producer在其属性中有一个事务id,在推送一些消息之后,它作为一个整体提交事务。以下是卡夫卡制作人的财产:-

Properties props = new Properties();
    props.put("bootstrap.servers", "10.2.200.15:9092");
    String consumeGroup = "cg3";
    props.put("group.id", consumeGroup);
    // Below is a key setting to turn off the auto commit.
    props.put("enable.auto.commit", "false");
    props.put("heartbeat.interval.ms", "2000");
    props.put("session.timeout.ms", "6001");
    // Control maximum data on each poll, make sure this value is bigger than the
    // maximum // single message size
    props.put("max.partition.fetch.bytes", "140");
    props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("isolation.level","read_committed");
log.info(“初始化属性”); Properties props=新属性()

下面的代码段负责提交事务:-

public boolean send(ProducerRecordImpl record) {
    try {
        producer.beginTransaction();
        for (int i = 0; i < 10; i++) {


            Future<RecordMetadata> futureResult = producer
                    .send(new ProducerRecord<String, String>(record.getTopic(), record.getPayload()));
            /*
             * It will wait till the thread execution completes and return true.
             */
            //RecordMetadata ack = futureResult.get();
            //log.debug("RecordMetadta offset {} and partiton {} ", ack.offset(), ack.partition());
        }
        producer.commitTransaction();
        log.info("Commited");


        return true;
public boolean发送(producercordimpl记录){
试一试{
producer.beginTransaction();
对于(int i=0;i<10;i++){
未来结果=生产商
.send(新产品记录(record.getTopic(),record.getPayload());
/*
*它将等待线程执行完成并返回true。
*/
//RecordMetadata ack=futureResult.get();
//debug(“RecordMetadta offset{}和partition{}”,ack.offset(),ack.partition());
}
producer.commitTransaction();
日志信息(“已提交”);
返回true;
我无法从生产者方面理解提交是否没有正确发生,这导致卡夫卡消费者无法使用事务语义阅读它,或者卡夫卡消费者方面存在问题


任何帮助都将不胜感激。

您需要先调用producer.initTransactions()。否则,您的producer不会发布事务消息

当transactional.id 在配置中设置。此方法执行以下操作:1。 确保由以前的实例启动的任何事务 具有相同transactional.id的生产者已完成。如果 实例失败,事务正在进行中,它将 中止。如果上一个事务已开始完成,但尚未完成 完成后,此方法将等待其完成。2.获取内部 生产者id和历元,用于将来的所有事务消息 由制作人发行


在Kafka上测试事务时,我也遇到了同样的问题。问题是操作系统。我使用Windows 10运行Kafka代理,消费者在配置为“read_committed”时看不到任何提交的事务,一旦我将代理移动到Linux,事务(和消费者)就开始工作。 顺便说一下,卡夫卡没有在日志中显示任何错误。
希望能有所帮助。

我深入研究了这个问题,发现我的上一个稳定偏移量是45。但我在消费者端的当前偏移量是365。因此,read_Committed将仅从上一个稳定偏移量读取。当我将当前偏移量更改为30时,Kafka消费者开始使用read_Committed属性消费邮件。所以我的问题是为什么我的上一个稳定偏移量是365当我从该方提交事务时,卡夫卡制作人不会更新偏移量。props.put(“retries”,3);props.put(“retry.backoff.ms”,1000);props.put(“max.in.flight.requests.per.connection”,1);//如果大于1,它可以更改顺序或记录。客户端可以发送的最大未确认请求数。props.put(“enable.idemponence”,true);props.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG,“Transaction15”);private KafkaTemplate(){log.info(“Kafka Producer的实例化”);Producer=new KafkaProducer(initializeProducerProperties());Producer.initTransactions();}您是否有要发布的3节点kafka群集?是否正在创建复制因子为3的_事务_状态主题?此问题与操作系统无关。此问题与kafka producer提交消息的方式更相关。