diff --git a/router/src/main/java/de/ozgcloud/eingang/router/VorgangRemoteService.java b/router/src/main/java/de/ozgcloud/eingang/router/VorgangRemoteService.java index 260cdc3818a4af61e2f93d632a66afb75a31062f..f185f2660abb46710b703e09752a6c22bd976dd1 100644 --- a/router/src/main/java/de/ozgcloud/eingang/router/VorgangRemoteService.java +++ b/router/src/main/java/de/ozgcloud/eingang/router/VorgangRemoteService.java @@ -27,6 +27,9 @@ import java.io.InputStream; import java.util.List; import java.util.Optional; import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -57,6 +60,7 @@ import io.grpc.stub.StreamObserver; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.log4j.Log4j2; @Log4j2 @@ -68,6 +72,8 @@ public class VorgangRemoteService { private final GrpcEingangMapper grpcEingangMapper; + private final ExecutorService taskExecutor = Executors.newVirtualThreadPerTaskExecutor(); + public String createVorgang(FormData formData, Optional<String> organisationsEinheitenId) { var vorgangServiceStub = getVorgangServiceStub(organisationsEinheitenId); var binaryFileServiceStub = getBinaryFileServiceStub(organisationsEinheitenId); @@ -121,11 +127,15 @@ public class VorgangRemoteService { @Getter private List<IncomingFile> uploadedRepresentations; + @SneakyThrows String create() { vorgangId = startCreation(); - uploadedAttachments = uploadAttachments(); - uploadedRepresentations = uploadRepresentations(); + var f1 = taskExecutor.submit(() -> uploadedAttachments = uploadAttachments()); + var f2 = taskExecutor.submit(() -> uploadedRepresentations = uploadRepresentations()); + for (var future : List.of(f1, f2)) { + future.get(10, TimeUnit.MINUTES); + } finishCreation(); return vorgangId; @@ -145,17 +155,27 @@ public class VorgangRemoteService { } private IncomingFileGroup uploadAttachment(IncomingFileGroup attachment) { - var filesWithId = attachment.getFiles().stream().map(this::addIncomingFileId).toList(); + var filesWithIdFutures = attachment.getFiles().stream().map(this::addIncomingFileId).toList(); + var fileGroupBuilder = IncomingFileGroup.builder().name(attachment.getName()); + filesWithIdFutures.stream().map(this::getUploadResult).forEach(fileGroupBuilder::file); + return fileGroupBuilder.build(); + } - return IncomingFileGroup.builder().name(attachment.getName()).files(filesWithId).build(); + IncomingFile getUploadResult(Future<IncomingFile> future) { + try { + return future.get(); + } catch (InterruptedException | ExecutionException e) { + throw new TechnicalException("Error on uploading file.", e); + } } List<IncomingFile> uploadRepresentations() { - return formData.getRepresentations().stream().map(this::addIncomingFileId).toList(); + var fileWithIdFutures = formData.getRepresentations().stream().map(this::addIncomingFileId).toList(); + return fileWithIdFutures.stream().map(this::getUploadResult).toList(); } - private IncomingFile addIncomingFileId(IncomingFile file) { - return file.toBuilder().id(uploadIncomingFile(file)).build(); + private Future<IncomingFile> addIncomingFileId(IncomingFile file) { + return taskExecutor.submit(() -> file.toBuilder().id(uploadIncomingFile(file)).build()); } String uploadIncomingFile(IncomingFile incomingFile) { @@ -199,6 +219,7 @@ public class VorgangRemoteService { fileSender.cancelOnError(e); throw new TechnicalException("Waiting for finishing upload was interrupted.", e); } catch (ExecutionException | TimeoutException e) { + LOG.error("Timeout exception '{}'", e.getClass().getSimpleName()); fileSender.cancelOnTimeout(); throw new TechnicalException("Error / Timeout on uploading data.", e); } finally {