java中的Executorservice异常处理

java中的Executorservice异常处理,java,executorservice,Java,Executorservice,我正在使用Java的executor服务特性。我想了解设计视角 如果其中一批出现问题,最好的处理方法是什么 我正在创建固定线程池 ExecutorService pool = Executors.newFixedThreadPool(10); 我还使用invokeall()调用所有返回future对象的可调用对象 以下是我的设想- 我有1000条来自xml文件的记录,我想保存到数据库中。 我创建了一批10,每批包含100条记录 批次开始处理(比如batch1、batch2、batch3…bat

我正在使用Java的executor服务特性。我想了解设计视角

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

我正在创建固定线程池

ExecutorService pool = Executors.newFixedThreadPool(10);
我还使用
invokeall()
调用所有返回future对象的可调用对象

以下是我的设想-

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

  • 批次开始处理(比如batch1、batch2、batch3…batch10),假设批次(batch7)中的一个在从xml解析记录时遇到特定记录的错误,并且无法保存到数据库中

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

    • 如何获取/存储失败的批次信息(上面的批次7)

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

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

  • 您应该使用
    CompletableFuture
    来执行此操作

    使用
    CompletableFuture.runAsync()
    异步启动一个进程,它返回一个未来。在将来,您可以使用
    然后接受(…)
    然后运行(…)
    方法在流程完成时执行某些操作

    还有一种方法,
    异常(…)
    在抛出异常时执行某些操作


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

    您应该使用
    CompletableFuture
    来执行此操作

    使用
    CompletableFuture.runAsync()
    异步启动一个进程,它返回一个未来。在将来,您可以使用
    然后接受(…)
    然后运行(…)
    方法在流程完成时执行某些操作

    还有一种方法,
    异常(…)
    在抛出异常时执行某些操作


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

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

    理想情况下,处理程序应该有一个有限的重试逻辑来处理少量的数据库错误


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

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

    理想情况下,处理程序应该有一个有限的重试逻辑来处理少量的数据库错误

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

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

    这完全取决于你的要求

    如何获取/存储失败的批次信息(上面的批次7)

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

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

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

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

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

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

    这完全取决于你的要求

    如何获取/存储失败的批次信息(上面的批次7)

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

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

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

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


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

    您不是“实现Java的executor服务功能”。这个功能很久以前由Java的创建者实现,现在您只是在尝试使用它。您如何提交任务?使用execute还是submit方法?看看这个问题,这个问题太宽了。堆栈溢出最适合于特定的编程问题,而不是依赖于很多事情的一般设计讨论。表明您的问题不太理想的迹象包括:它不包含代码,而是