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
Apache kafka 如何使用camel kafka手动控制偏移量提交?_Apache Kafka_Apache Camel - Fatal编程技术网

Apache kafka 如何使用camel kafka手动控制偏移量提交?

Apache kafka 如何使用camel kafka手动控制偏移量提交?,apache-kafka,apache-camel,Apache Kafka,Apache Camel,我使用的是camel-kafka组件,我不清楚在提交偏移量时引擎盖下发生了什么。如下所示,我正在聚合记录,我认为对于我的用例来说,只有在记录保存到SFTP后提交偏移量才有意义 是否可以手动控制何时可以执行提交 私有静态类MyRouteBuilder扩展了RouteBuilder{ @凌驾 public void configure()引发异常{ from(“kafka:{{mh.topic}}?”+getkafkanconfigstring() .unmarshal().string() .ag

我使用的是camel-kafka组件,我不清楚在提交偏移量时引擎盖下发生了什么。如下所示,我正在聚合记录,我认为对于我的用例来说,只有在记录保存到SFTP后提交偏移量才有意义

是否可以手动控制何时可以执行提交

私有静态类MyRouteBuilder扩展了RouteBuilder{
@凌驾
public void configure()引发异常{
from(“kafka:{{mh.topic}}?”+getkafkanconfigstring()
.unmarshal().string()
.aggregate(常量(true),新的MyAggregationStrategy())
.completionSize(1000)
.completionTimeout(1000)
.setHeader(“CamelFileName”).constant(“事务-”+(新日期()).getTime())
.to(“sftp://”+getsftpconfig字符串())
//如何仅在将消息保存到SFTP后提交偏移量?
;
}
私有最终类MyAggregationStrategy实现AggregationStrategy{
@凌驾
公共交换聚合(交换旧交换、交换新交换){
if(oldExchange==null){
返回newExchange;
}
String oldBody=oldchange.getIn().getBody(String.class);
String newBody=newExchange.getIn().getBody(String.class);
串体=旧体+新体;
oldchange.getIn().setBody(body);
退换货;
}
}
}
私有静态字符串getSftpConfigString(){
返回“{sftp.hostname}}/{{sftp.dir}}”
+“用户名={{sftp.username}}”
+“&password={{sftp.password}}”
+“&tempPrefix=.temp。”
+“&fileExist=Append”
;
}
私有静态字符串getkafkanconfigstring(){
返回“brokers={{mh.brokers}}”
+“&saslMechanism={{mh.saslMechanism}”
+“&securityProtocol={{mh.securityProtocol}}”
+“&sslProtocol={{mh.sslProtocol}}”
+“&sslEnabledProtocols={{mh.sslEnabledProtocols}}”
+“&sslEndpointAlgorithm={{mh.sslEndpointAlgorithm}}”
+“&saslJaasConfig={{mh.saslJaasConfig}”
+“&groupId={{mh.groupId}}”
;
}

不,您不能。卡夫卡每X秒在后台执行一次自动提交(您可以对此进行配置)


camel kafka中不支持手动提交。此外,这是不可能的,因为聚合器与kafka使用者分离,而它是执行提交的使用者。

不,您不能。卡夫卡每X秒在后台执行一次自动提交(您可以对此进行配置)


camel kafka中不支持手动提交。此外,这是不可能的,因为聚合器与kafka使用者分离,而执行提交的使用者是使用者。

我认为这是最新版本的camel(2.22.0)()中的更改,您应该能够做到这一点

// Endpoint configuration &autoCommitEnable=false&allowManualCommit=true
public void process(Exchange exchange) {
     KafkaManualCommit manual = exchange.getIn().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
     manual.commitSync();
}

我认为这是最新版本的camel(2.22.0)中的变化(),您应该能够做到这一点

// Endpoint configuration &autoCommitEnable=false&allowManualCommit=true
public void process(Exchange exchange) {
     KafkaManualCommit manual = exchange.getIn().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
     manual.commitSync();
}

您甚至可以通过使用偏移存储库()在多线程路由(例如使用聚合器)中控制手动偏移提交


您甚至可以通过使用偏移存储库()在多线程路由(例如使用聚合器)中控制手动偏移提交


在这个问题上可以找到关于如何使用Kafka Manual Commit的详细介绍。我认为在路由中有聚合器的情况下,手动提交是不可能的。聚合器作为必须提交消息的使用者在分离的线程中工作。有人能解决这个问题吗?对于我的用例,聚合后提交很重要,因为如果杀死实例而不优雅地关闭路由,我可能会丢失数据。@R\u FF92下面的一个示例关于如何使用Kafka手动提交的详细信息可以在这个问题上找到。我认为在路由中有聚合器的情况下,手动提交是不可能的。聚合器作为必须提交消息的使用者在分离的线程中工作。有人能解决这个问题吗?对于我的用例,聚合后提交很重要,因为如果杀死实例而不优雅地关闭路由,我可能会丢失数据。@R\u FF92下面的一个示例您是否可以共享关于您的声明“camel kafka中不支持手动提交”的文档这是4年前的事,请查看camel网站文档中的camel kafka组件,它支持手动提交是的,找到了,但忘了在这里更新。感谢您共享文档关于您的声明“camel kafka中不支持手动提交”这是4年前的事了,请查看camel网站文档中的camel kafka组件,它支持手动提交是的,找到了,但忘了在这里更新。谢谢