Java 在camel kafka中引发异常时不提交偏移量

Java 在camel kafka中引发异常时不提交偏移量,java,apache-camel,apache-kafka,kafka-consumer-api,Java,Apache Camel,Apache Kafka,Kafka Consumer Api,我使用的是camel kafka组件。我们必须严格订购,我们不能承担信息丢失。因此,在某些异常情况下,我们不希望提交偏移量。我已经设置了自动提交=false,并且没有处理异常。但无论抛出哪个异常,偏移量都会被提交(只有stacktrace会被打印) 为了处理这个场景,我更改了camel kafka中的源代码。以下是片段: try { KafkaConsumer.this.processor.process(exchange); if (KafkaConsumer

我使用的是camel kafka组件。我们必须严格订购,我们不能承担信息丢失。因此,在某些异常情况下,我们不希望提交偏移量。我已经设置了自动提交=false,并且没有处理异常。但无论抛出哪个异常,偏移量都会被提交(只有stacktrace会被打印)

为了处理这个场景,我更改了camel kafka中的源代码。以下是片段:

 try {
        KafkaConsumer.this.processor.process(exchange);
        if (KafkaConsumer.this.endpoint.getConfiguration().isAutoCommitEnable() != null
                && !KafkaConsumer.this.endpoint.getConfiguration().isAutoCommitEnable()
                        .booleanValue()) {
            this.consumer.commitSync(Collections.singletonMap(partition,
                    new OffsetAndMetadata(record.offset() + 1L)));
// Commit one by one
        }
    } catch (Exception arg13) {
        KafkaConsumer.this.getExceptionHandler().handleException("Error during processing",
                exchange, arg13);
        if (KafkaConsumer.LOG.isTraceEnabled()) {
            KafkaConsumer.LOG.trace(
                    "Caught an exception while processing partition {}, Kafka message (offset = {}) ",
                    Integer.valueOf(record.partition()), Long.valueOf(record.offset()));
        }
        break; // Break in case of any exception 
    }
但这里也没有运气。即使我是否编写了处理程序,流也不会出现在Catch块中。因此,抵销总是被委托的。这是正常的行为吗?在发生异常时,如何停止camel以提交偏移量


我可以看到,在春季卡卡法中有一个属性“ackOnError”。我们在卡夫卡有类似的财产吗(我找不到)?请提供帮助。

最后,经过大量调试后,我可以看到camel不会将异常传播回exchange,而是将其设置为属性“exchange.exception\u catch”。下面是我在camel kafka的KafkaConsumer.java#run类中修改的示例代码,在出现异常时不提交偏移量

try {
      KafkaConsumer.this.processor.process(exchange);
      Throwable e1 = (Throwable) exchange.getProperty(Exchange.EXCEPTION_CAUGHT , Throwable.class);
        if (e1 != null) {
                throw e1;
            }
            if (KafkaConsumer.this.endpoint.getConfiguration().isAutoCommitEnable() != null
                                        && !KafkaConsumer.this.endpoint.getConfiguration().isAutoCommitEnable()
                                                .booleanValue()) {
            this.consumer.commitSync(Collections.singletonMap(partition,
                                            new OffsetAndMetadata(record.offset() + 1L)));
            }
            } 
            catch (Throwable arg13) {
                KafkaConsumer.this.getExceptionHandler().handleException("Error during processing",
                                        exchange, arg13);
                    break;
            }

到目前为止,这个例子对我很有效,效果很好。如果有人是Camel或Kafka专家,请告诉我这样做是否会有任何后果,因为我没有找到任何后果。

您是否设置了
自动提交功能
?还是启用了
?仔细阅读并记住,即使是spring kafka的
ackOnError
也有有限的功能,因为下一条成功的消息将提交其偏移量。出现这种情况时,您必须停止消费者(并解决问题)。@SergeyBenner Yes。正如我在问题中提到的,我已经将autocommitteable设置为false。更正了输入错误。@GaryRussell是的。我知道。