0

In a Spring Boot application, I'm writing files to S3 using list.stream().parallel().forEach. When trying to get the resource using resourceLoader.getResource(filePath), it throws the exception 'com.amazonaws.services.s3.AmazonS3 referenced from a method is not visible from class loader'. I've noticed that the main thread successfully writes the files, but the child thread throws an exception.

getAccountCommonList()
                .stream().parallel()
//                    .stream()
                .forEach(fileNumber -> {
                    String filePath =
                            "s3://xxxxx.net/Debug_"
                            + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmm"))
                            + "_"
                            + fileNumber;
                    WritableResource resource = (WritableResource) resourceLoader.getResource(filePath);

                    try (OutputStream outputStream = resource.getOutputStream()) {
                        write(outputStream);
                    } catch (IOException e) {
                        System.console().printf(e.getMessage(), e);
                        throw new RuntimeException(e);
                    }
                });

If I don't use parallel(), the code executes successfully.

I'd like to know how to proceed if I need to use parallel(). Could it be because the child thread cannot access the applicationContext? Is it possible that the applicationContext is bound to the main thread through ThreadLocal?

0 Answers0