java 中的 ExecutorService 异常处理
Executorservice exception handling in java
我正在使用 Java 的执行程序服务功能。我想了解设计的角度。
如果其中一个批次出现问题,最好的处理方法是什么?
我正在创建固定线程池,
ExecutorService pool = Executors.newFixedThreadPool(10);
此外,我正在使用 invokeall()
来调用所有返回未来对象的可调用对象。
这是我的场景 -
我有 1000 条来自 xml 文件的记录,我想保存到数据库中。
我创建了一批 10,每批包含 100 条记录。
批次开始处理(例如批次 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 文件告知来源,以便他们可以更正文件并将其发回给您。收到新副本后,您必须推送新文件进行处理。它可以是手动的或自动的,这取决于您的设计。
我正在使用 Java 的执行程序服务功能。我想了解设计的角度。
如果其中一个批次出现问题,最好的处理方法是什么?
我正在创建固定线程池,
ExecutorService pool = Executors.newFixedThreadPool(10);
此外,我正在使用 invokeall()
来调用所有返回未来对象的可调用对象。
这是我的场景 -
我有 1000 条来自 xml 文件的记录,我想保存到数据库中。 我创建了一批 10,每批包含 100 条记录。
批次开始处理(例如批次 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 文件告知来源,以便他们可以更正文件并将其发回给您。收到新副本后,您必须推送新文件进行处理。它可以是手动的或自动的,这取决于您的设计。