Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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
Spring 在下一个通量元素上重试,并忽略成功的通量元素_Spring_Reactive Programming_Spring Webflux_Project Reactor - Fatal编程技术网

Spring 在下一个通量元素上重试,并忽略成功的通量元素

Spring 在下一个通量元素上重试,并忽略成功的通量元素,spring,reactive-programming,spring-webflux,project-reactor,Spring,Reactive Programming,Spring Webflux,Project Reactor,有点背景 我正在尝试使用反应式编程,以便能够从其他服务下载文件。诀窍是,在连接失败或通量元素失败的情况下,我希望对通量重试多次,但一旦能够掌握它,我希望在不处理元素的情况下从一开始就恢复 我的意思是,有些地方出了问题,在100个可能的元素中,我只得到了56个元素,假设是.jpg中的一个图像,因为连接失败。一旦我成功重试,我想在第57个元素上继续,这样我就不必处理它,也不必再次从头开始执行GET 以下是正常重试的情况: 但我想实现的是,在重试时,我只需要得到红色元素,因为我已经有了黄色和紫色 只

有点背景

我正在尝试使用反应式编程,以便能够从其他服务下载文件。诀窍是,在连接失败或通量元素失败的情况下,我希望对通量重试多次,但一旦能够掌握它,我希望在不处理元素的情况下从一开始就恢复

我的意思是,有些地方出了问题,在100个可能的元素中,我只得到了56个元素,假设是.jpg中的一个图像,因为连接失败。一旦我成功重试,我想在第57个元素上继续,这样我就不必处理它,也不必再次从头开始执行GET

以下是正常重试的情况:

但我想实现的是,在重试时,我只需要得到红色元素,因为我已经有了黄色和紫色

只是一个旁注,我想实现的功能,因为我可以得到特定范围内的字节,只有在失败的情况下,我将能够从我想要的字节恢复


这可能是我想要实现的吗?如果是这样,可能采取什么行动?

您需要在要请求的范围的开始处保留一些状态,至少每个订户都要这样做。这必须在重试的上游进行,以便每次重试都重新评估范围。同时,状态应该是可原子更新的,并且在重试的下游可见,以便进行更新。我假设您正在使用WebClient:

平面图可用于创建范围状态可见的范围 在lambda中,可以使用原子长作为状态 同样在flatmap lambda中,将webclient调用包装在Flux.defer中,以确保延迟创建请求,并重新评估状态,以便从AtomicLong生成适当的头读取 在延迟后追加重试 在接收和处理每个工件后(如在下一个工件中),根据需要更新AtomicLong
最简单的解决方案是跟踪您已下载的特定通量元素或范围的数据量。下次重试时,您可以跳过已下载的元素。@Sarowar这个问题是关于如何跳过已下载的元素我猜您将使用WebClient发出请求。但在请求之前,如果您确实需要发出请求并在每次完成下载时更新状态,请重新评估范围。在下一次重试中,您可以检查更新的状态重新评估。您将在每次重试时获得所有元素,只需选择不处理已处理的元素。我认为Simon Baslé的回答也有同样的意思。