Java 项目反应堆卡夫卡:在通量结束时执行动作,无阻塞
我正在开发一个应用程序,该应用程序使用Java 项目反应堆卡夫卡:在通量结束时执行动作,无阻塞,java,apache-kafka,nio,project-reactor,reactive,Java,Apache Kafka,Nio,Project Reactor,Reactive,我正在开发一个应用程序,该应用程序使用projectreactorKafka API反应性地连接到Kafka代理。用例是有一个输入主题,其中包含要处理的文件的文件路径。应用程序读取每个文件,对其进行处理,创建处理后的消息流,并将其推送到输出主题。要求是,一旦处理完文件,就必须将其删除,并将处理过的消息推送到输出主题。因此,必须在处理完每个文件并将消息流推送到输出主题之后执行删除操作 public Flux<?> flux() { return KafkaReceiver
projectreactor
Kafka API反应性地连接到Kafka代理
。用例是有一个输入主题,其中包含要处理的文件的文件路径。应用程序读取每个文件,对其进行处理,创建处理后的消息流,并将其推送到输出主题。要求是,一旦处理完文件,就必须将其删除,并将处理过的消息推送到输出主题。因此,必须在处理完每个文件并将消息流推送到输出主题之后执行删除操作
public Flux<?> flux() {
return KafkaReceiver
.create(receiverOptions(Collections.singleton(sourceTopic)))
.receive()
.flatMap(m -> transform(m.value()).map(x -> SenderRecord.create(x,
m.receiverOffset())))
.as(sender::send)
.doOnNext(m -> {
m.correlationMetadata().acknowledge();
deleteFile(path);
}).doOnCancel(() -> close());
公共流量(){
返回卡夫卡接收器
.create(receiverOptions(Collections.singleton(sourceTopic)))
.receive()
.flatMap(m->transform(m.value()).map(x->SenderRecord.create(x,
m、 接收方抵销()))
.as(发件人::发送)
.doOnNext(m->{
m、 correlationMetadata().acknowledge();
删除文件(路径);
}).doOnCancel(()->close());
}
*transform()方法在文件路径(m.value())中启动文件处理并返回消息流
问题是,即使在将所有消息推送到输出主题之前,文件也会被删除。因此,如果出现故障,重新尝试时原始文件不可用。由于整个管道中似乎可以访问
路径
变量(方法输入参数?),因此您可以在单独的doFinally
中删除该文件。您需要筛选onComplete
或cancel
SignalType
,因为您不希望在出现故障时删除该文件
另一个选项是
doOnComplete
,如果您对取消时删除文件不感兴趣。同样适用于输入主题的偏移提交,我必须确保只有在将文件的所有已处理消息推送到输出主题后才进行确认。