Apache Kafka中的消息使用确认

时间:2018-06-06 05:49:34

标签: java apache-kafka

我实现了一个Java Consumer,它使用来自Kafka主题的消息,然后将这些消息与POST请求一起发送到REST API。

    while (true) {
        ConsumerRecords<String, Object> records = consumer.poll(200);
        for (ConsumerRecord<String, Object> record : records) {
            CloseableHttpClient httpClient = HttpClientBuilder.create().build();  
            Object message = record.value();
            JSONObject jsonObj = new JSONObject(message.toString());
            try {
                HttpPost request = new HttpPost(this.getConsumerProperties().getProperty("api.url"));
                StringEntity params = new StringEntity(message.toString());
                request.addHeader("content-type", "application/json");
                request.addHeader("Accept", "application/json");
                request.setEntity(params);

                CloseableHttpResponse response = httpClient.execute(request);
                HttpEntity entity = response.getEntity();
                String responseString = EntityUtils.toString(entity, "UTF-8");
                System.out.println(message.toString());
                System.out.println(responseString);
            } catch(Exception ex) {
              ex.printStackTrace();
            }  finally {
                try {   
                    httpClient.close(); 
                } catch(IOException ex) {
                    ex.printStackTrace();
                } 
            }                  
        } 
    }   

假设消息已被使用,但Java类未能使用REST API。邮件永远不会被传递,但会被标记为已消耗。处理此类案件的最佳方法是什么?当且仅当REST API的响应成功时,我才能以某种方式确认消息吗?

2 个答案:

答案 0 :(得分:0)

你应该控制提交日志(不记得确切的名字) Basycally关闭自动提交并确保仅在成功进行远程http调用后才提交。

答案 1 :(得分:0)

在使用者属性中,将enable.auto.commit设置为false。 这意味着承诺抵消的责任在于消费者。

因此,在上面的示例中,基于response.statusCode,您可以选择通过调用consumer.commitAsync()来提交偏移量。