How to manually control the offset commit with camel-kafka?

后端 未结 3 1377
小鲜肉
小鲜肉 2021-01-16 05:59

I\'m using the camel kafka component and I\'m unclear what is happening under the hood with committing the offsets. As can be seen below, I\'m aggregating records and I thin

相关标签:
3条回答
  • 2021-01-16 06:51

    I think this is change in the latest version of camel (2.22.0) (the doc) you should be able to do that.

    // Endpoint configuration &autoCommitEnable=false&allowManualCommit=true
    public void process(Exchange exchange) {
         KafkaManualCommit manual = exchange.getIn().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
         manual.commitSync();
    }
    
    0 讨论(0)
  • 2021-01-16 06:52

    You can control manual offset commit even in multi threaded route (using aggregator for exemple) by using offset repository (Camel Documentation)

    @Override
    public void configure() throws Exception {
          // The route
          from(kafkaEndpoint())
                .routeId(ROUTE_ID)
                // Some processors...
                // Commit kafka offset
                .process(MyRoute::commitKafka)
                // Continue or not...
                .to(someEndpoint());
    }
    
    private String kafkaEndpoint() {
        return new StringBuilder("kafka:")
                .append(kafkaConfiguration.getTopicName())
                .append("?brokers=")
                .append(kafkaConfiguration.getBootstrapServers())
                .append("&groupId=")
                .append(kafkaConfiguration.getGroupId())
                .append("&clientId=")
                .append(kafkaConfiguration.getClientId())
                .append("&autoCommitEnable=")
                .append(false)
                .append("&allowManualCommit=")
                .append(true)
                .append("&autoOffsetReset=")
                .append("earliest")
                .append("&offsetRepository=")
                .append("#fileStore")
                .toString();
    
    }
    
    @Bean(name = "fileStore", initMethod = "start", destroyMethod = "stop")
    private FileStateRepository fileStore() {
        FileStateRepository fileStateRepository = 
        FileStateRepository.fileStateRepository(new File(kafkaConfiguration.getOffsetFilePath()));
        fileStateRepository.setMaxFileStoreSize(10485760); // 10MB max
    
        return fileStateRepository;
    }
    
    private static void commitKafka(Exchange exchange) {
        KafkaManualCommit manual = exchange.getIn().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
        manual.commitSync();
    }
    
    0 讨论(0)
  • 2021-01-16 06:55

    No you cannot. Kafka performs an auto commit in the background every X seconds (you can configure this).

    There is no manual commit support in camel-kafka. Also this would not be possible as the aggregator is separated from the kafka consumer, and its the consumer that performs the commit.

    0 讨论(0)
提交回复
热议问题