java 中的 ExecutorService 异常处理

Executorservice exception handling in java

我正在使用 Java 的执行程序服务功能。我想了解设计的角度。

如果其中一个批次出现问题,最好的处理方法是什么?

我正在创建固定线程池,

ExecutorService pool = Executors.newFixedThreadPool(10);

此外,我正在使用 invokeall() 来调用所有返回未来对象的可调用对象。

这是我的场景 -

  1. 我有 1000 条来自 xml 文件的记录,我想保存到数据库中。 我创建了一批 10,每批包含 100 条记录。

  2. 批次开始处理(例如批次 1、批次 2、批次 3...批次 10),假设其中一个批次(批次 7)在解析来自 [=57= 的记录时遇到了特定记录的错误] 无法保存到数据库中。

    • 所以我的问题是我该如何处理这种情况?

    • 如何get/store 失败的批次信息(上面的批次7)?

    • 我的意思是,如果任何一个批次有任何错误,我应该停止所有其他批次吗?

    • 或者我可以在哪里存储失败批次的信息,以及如何在错误更正后将其用于进一步处理?

你应该使用 CompletableFuture 来做到这一点

使用CompletableFuture.runAsync( )启动一个异步进程,它returns一个未来。在这个未来,你可以使用 thenAccept(..)thenRun(..) 方法在过程完成时做一些事情。

还有一个方法,exceptionally(..)在抛出异常时做一些事情。

默认情况下,它使用默认执行程序服务来执行此异步操作,但如有必要,您可以使用自己的服务。

具有处理记录逻辑的处理程序应该有一个存储批号的变量。

理想情况下,处理程序应该具有针对少数数据库错误的有限重试逻辑。

一旦重试计数耗尽,就需要人为干预,它应该退出抛出异常和批号。理想情况下,执行者应该调用 shutDown 。如果您的逻辑要求立即停止进程,那么您应该调用 shutDownNow。理想情况下,您的设计应该能够抵抗此类故障,并让其他批次继续工作,即使一个失败。希望对你有帮助

So my question is how I can handle this situation ?

这完全取决于您的要求。

How I can get/store failed batch information (batch7 above) ?

您可以将其存储在文件或数据库中。

I mean, if there is any error in any of batch should i stop all other batches ?

这取决于您的业务用例。如果您要求即使单批失败也停止批处理,则必须停止下一批。否则,您可以继续下一组批次。

Or where i can store information for failed batch and how I can take it for further processing once error corrected ?

这也取决于您的要求和设计。您可能必须将有问题的 XML 文件告知来源,以便他们可以更正文件并将其发回给您。收到新副本后,您必须推送新文件进行处理。它可以是手动的或自动的,这取决于您的设计。