Spring Boot 在Java中执行并行方法调用,而不会因一个或多个方法调用中的任何异常而中止整个处理

m2xkgtsf  于 2022-11-05  发布在  Spring
关注(0)|答案(1)|浏览(147)

我有个办法

private void disableXYZ(Long rId, List<Long> disableIds, String requestedBy) {
        for (Long disableId : disableIds) {
            try {
                disablePackXYZ(UnSubscribeRequest.unsubscriptionRequest()
                        .requestedBy(requestedBy)
                        .cancellationReason("system")
                        .id(disableId)
                        .build());
            } catch (Exception e) {
                log.error("Failed to disable pack. id: {}, rId: {}. Error: {}", disableId, rId, e.getMessage());
            }
        }
    }

我想使用disableIds列表中的id对disablePackXYZ进行并行方法调用,而不是迭代for循环。但这样做时,如果任何一个或多个disablePackXYZ调用引发异常,我不想中止所有并行调用。我可以捕获或抑制异常,但它不应中止所有其他线程的处理或同一线程的后续任务的处理。请建议相同的方法。
我通过网络浏览了java流方法-

final CompletableFuture<ParseException> thrownException = new CompletableFuture<>();
Stream.of(columns).parallel().forEach(column -> {
    try {
        result[column.index] = parseColumn(valueCache[column.index], column.type);
    } catch (ParseException e) {
        thrownException.complete(e);
    }});

对于上面的方法,我在网上发现,如果线程中至少有一个异常抛出,forEach调用会将它(或其中一个)传播给调用者。因此,当前实现在遇到异常时不会等待所有线程完成。

ilmyapht

ilmyapht1#

你已经有了一个result[]数组来存储结果,只需要创建一个error[]数组来存储异常。在你的catch语句中,把异常存储到error[]数组中,不要调用thrownException.complete(e)。

相关问题