From 1c303f1376dcb8809d3d0b2264e68f31eeb8f36b Mon Sep 17 00:00:00 2001 From: "Simon C. Kessler" Date: Wed, 22 Apr 2026 15:25:24 +0200 Subject: [PATCH] OCI object storage api fehler behoben --- .claude/settings.local.json | 5 ++- quarkus-automaton/.vscode/settings.json | 2 +- quarkus-automaton/pom.xml | 12 ++--- .../dateieingang/oci/OciUploadService.java | 44 +++++++++++-------- .../pipeline/FileProcessingPipeline.java | 2 +- .../src/main/resources/application.properties | 2 +- 6 files changed, 36 insertions(+), 31 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 8b4d58d..f5c663d 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -9,7 +9,10 @@ "Bash(sed -n '582,600p' \"C:\\\\src\\\\Galabau\\\\glb-spielwiese\\\\database\\\\packages\\\\pck_net_storage.pkb\")", "WebFetch(domain:docs.public.oneportal.content.oci.oraclecloud.com)", "Bash(./mvnw compile *)", - "WebFetch(domain:medium.com)" + "WebFetch(domain:medium.com)", + "WebFetch(domain:quarkus.io)", + "WebFetch(domain:github.com)", + "WebFetch(domain:walidhajeri.hashnode.dev)" ] } } diff --git a/quarkus-automaton/.vscode/settings.json b/quarkus-automaton/.vscode/settings.json index c5f3f6b..0e14d8e 100644 --- a/quarkus-automaton/.vscode/settings.json +++ b/quarkus-automaton/.vscode/settings.json @@ -1,3 +1,3 @@ { - "java.configuration.updateBuildConfiguration": "interactive" + "java.configuration.updateBuildConfiguration": "disabled" } \ No newline at end of file diff --git a/quarkus-automaton/pom.xml b/quarkus-automaton/pom.xml index 0dddb51..193037a 100644 --- a/quarkus-automaton/pom.xml +++ b/quarkus-automaton/pom.xml @@ -75,17 +75,11 @@ 0.38.0 - - + com.oracle.oci.sdk - oci-java-sdk-objectstorage - 3.44.0 - - - - com.oracle.oci.sdk - oci-java-sdk-common-httpclient-jersey3 + oci-java-sdk-shaded-full 3.44.0 diff --git a/quarkus-automaton/src/main/java/de/galabau/dateieingang/oci/OciUploadService.java b/quarkus-automaton/src/main/java/de/galabau/dateieingang/oci/OciUploadService.java index 0134b28..8d22b21 100644 --- a/quarkus-automaton/src/main/java/de/galabau/dateieingang/oci/OciUploadService.java +++ b/quarkus-automaton/src/main/java/de/galabau/dateieingang/oci/OciUploadService.java @@ -1,5 +1,6 @@ package de.galabau.dateieingang.oci; +import com.oracle.bmc.Region; import com.oracle.bmc.auth.SimpleAuthenticationDetailsProvider; import com.oracle.bmc.objectstorage.ObjectStorage; import com.oracle.bmc.objectstorage.ObjectStorageClient; @@ -9,6 +10,7 @@ import de.galabau.dateieingang.exception.OciException; import de.galabau.dateieingang.model.FileEntry; import de.galabau.dateieingang.model.ProcessingContext; import io.quarkus.logging.Log; +import io.quarkus.runtime.Startup; import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -23,6 +25,7 @@ import java.util.List; * Lädt die entpackten Dateien und den Marker in OCI Object Storage hoch. * Authentifizierung via OCI HTTP Signature V1 (entspricht APEX Web Credential vom Typ OCI). */ +//@Startup @ApplicationScoped public class OciUploadService { @@ -34,24 +37,29 @@ public class OciUploadService { @PostConstruct void init() { Log.info("Initialisiere OCI ObjectStorage-Client..."); - SimpleAuthenticationDetailsProvider auth = SimpleAuthenticationDetailsProvider.builder() - .tenantId(config.tenancyId()) - .userId(config.userId()) - .fingerprint(config.fingerprint()) - .privateKeySupplier(() -> { - try { - return Files.newInputStream(Path.of(config.privateKeyPath())); - } catch (IOException e) { - throw new RuntimeException("OCI Private Key nicht lesbar: " - + config.privateKeyPath(), e); - } - }) - .build(); - Log.info("Auhtentifizierung..."); - client = ObjectStorageClient.builder() - .endpoint("https://objectstorage." + config.region() + ".oraclecloud.com") - .build(auth); - Log.infof("OCI ObjectStorage-Client initialisiert (Region: %s, Bucket: %s)", config.region(), config.bucket()); + try { + SimpleAuthenticationDetailsProvider auth = SimpleAuthenticationDetailsProvider.builder() + .tenantId(config.tenancyId()) + .userId(config.userId()) + .fingerprint(config.fingerprint()) + .region(Region.fromRegionId(config.region())) + .privateKeySupplier(() -> { + try { + return Files.newInputStream(Path.of(config.privateKeyPath())); + } catch (IOException e) { + throw new RuntimeException("OCI Private Key nicht lesbar: " + + config.privateKeyPath(), e); + } + }) + .build(); + Log.info("Authentifizierung..."); + client = ObjectStorageClient.builder() + .build(auth); + Log.infof("OCI ObjectStorage-Client initialisiert (Region: %s, Bucket: %s)", config.region(), config.bucket()); + } catch (Throwable e) { + Log.errorf(e, "OCI ObjectStorage-Client Initialisierung fehlgeschlagen"); + throw new RuntimeException("OCI-Client konnte nicht initialisiert werden", e); + } } /** diff --git a/quarkus-automaton/src/main/java/de/galabau/dateieingang/pipeline/FileProcessingPipeline.java b/quarkus-automaton/src/main/java/de/galabau/dateieingang/pipeline/FileProcessingPipeline.java index 7cd676f..3891b88 100644 --- a/quarkus-automaton/src/main/java/de/galabau/dateieingang/pipeline/FileProcessingPipeline.java +++ b/quarkus-automaton/src/main/java/de/galabau/dateieingang/pipeline/FileProcessingPipeline.java @@ -69,7 +69,7 @@ public class FileProcessingPipeline { executor.submit(() -> { try { processAll(); - } catch (Exception e) { + } catch (Throwable e) { // nicht exception catchen, weil Error in OCI SDK auftreten können, die Throwable aber nicht Excption sind. Die würden sonst nicht geloggt Log.errorf(e, "Unerwarteter Fehler im Pipeline-Lauf"); } finally { isRunning.set(false); diff --git a/quarkus-automaton/src/main/resources/application.properties b/quarkus-automaton/src/main/resources/application.properties index 0ad6d5c..d1b5bd4 100644 --- a/quarkus-automaton/src/main/resources/application.properties +++ b/quarkus-automaton/src/main/resources/application.properties @@ -39,7 +39,7 @@ galabau.oci.fingerprint=${OCI_FINGERPRINT} # Base-URL bis einschließlich Modul-Pfad, z.B. https://apex.example.com/ords/myschema/auto_import galabau.ords.base-url=${GALABAU_ORDS_BASE_URL} galabau.ords.api-key=${GALABAU_ORDS_API_KEY} -# MicroProfile REST Client liest die URL aus dieser Property: +# MicroProfile REST Client liest die URL aus dieser Property. Das hier ist eine einfache weiterleitung auf die env variable GALABAU_ORDS_BASE_URL (s.o.) quarkus.rest-client.ords-client.url=${galabau.ords.base-url} # ===== Observability =====