Java 在camel kafka中引发异常时不提交偏移量
我使用的是camel kafka组件。我们必须严格订购,我们不能承担信息丢失。因此,在某些异常情况下,我们不希望提交偏移量。我已经设置了自动提交=false,并且没有处理异常。但无论抛出哪个异常,偏移量都会被提交(只有stacktrace会被打印) 为了处理这个场景,我更改了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
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是的。我知道。