Zum Hauptinhalt springen

Große Anhänge senden und empfangen

TL;DR – Anhänge ≥ 500 MB oder große Anhangsbatches in Fragmente zerlegen, die einzeln verschlüsselt und übertragen werden. Senderseite aktiviert Chunking pro Attachment oder global; Empfänger streamt die zusammengesetzten Daten.

Wann brauchen Sie Chunking?​

Standardmäßig erlaubt FIT-Connect Anhänge bis 500 MB pro Stück. Wenn Sie

  • einen einzelnen Anhang > 500 MB übertragen wollen oder
  • mehrere Anhänge zusammen viel Speicher belegen würden,

zerlegen die SDKs den Anhang in Fragmente, die einzeln verschlüsselt und übertragen werden. Der Empfänger setzt die Fragmente automatisch wieder zusammen.

Senderseite: Großes Attachment versenden​

Aktiviert wird Chunking pro Attachment über den Builder:

Attachment large = Attachment.builder()
.fromFile(Paths.get("messreihen.bin"))
.mimeType("application/octet-stream")
.fileName("messreihen.bin")
.description("Messreihen Q1")
.shouldBeChunked(true)
.build();

Globales Chunking aktiviert eine Einstellung in config.yaml — oder derselbe Wert am Builder:

sdkSettings:
attachmentChunkingConfig:
chunkAllAttachments: true
chunkSizeInMB: 50
attachmentStoragePath: "/var/lib/fit-connect"
SdkSettings settings = SdkSettings.builder()
.attachmentChunkingConfig(AttachmentChunkingConfig.builder()
.chunkAllAttachments(true)
.chunkSizeInMB(50)
.attachmentStoragePath(Path.of("/var/lib/fit-connect"))
.build())
.build();
// FitConnectSdk.fromConfigBuilder()….settings(settings).build()

Was im Hintergrund passiert​

Der Vorteil ist nicht in erster Linie dass das Attachment in Fragmente zerlegt wird, sondern dass immer nur ein Fragment gleichzeitig im RAM gehalten werden muss. Nach dem Hochladen wird es freigegeben, bevor das nächste geladen wird. Damit kann der Sender ein 2 GB-Attachment auch auf einer Maschine mit 512 MB RAM übertragen.

Wie viele Fragmente entstehen bei welcher Größe?​

Attachment-GrößeDefault-Chunk-Size (50 MB)Mit 100 MB Chunks
100 MB2 Fragmentekein Chunking nötig (< 500 MB)
500 MB10 Fragmente5 Fragmente
1 GB20 Fragmente10 Fragmente
2 GB (Max)40 Fragmente20 Fragmente
Wann lohnt sich eine größere Chunk-Size?

Größere Chunks reduzieren den HTTP-Overhead pro Übertragung, kosten aber proportional mehr RAM pro Fragment. Bei stabilen Verbindungen sind 100–200 MB sinnvoll; in mobilen oder fehleranfälligen Netzen lieber kleinere Chunks, damit ein Retry weniger Daten wiederholt.

Empfängerseite: Auf große Anhänge zugreifen​

Der Empfänger erhält ein Attachment-Objekt wie üblich. Greifen Sie auf gechunkte Anhänge stream-basiert zu, statt sie komplett in den RAM zu laden:

for (Attachment a : received.getAttachments()) {
try (InputStream stream = a.openStream()) {
Files.copy(stream, Paths.get("/safe/" + a.getFileName()));
}
}
Persistierung in Ihr Fachverfahren

Die vom SDK erzeugten Dateien sind als temporär gedacht. Verschieben Sie wichtige Inhalte in Ihr Fachverfahren oder einen DMS-Speicher, bevor Sie die Submission akzeptieren und damit den Cleanup auslösen.

Attachment-Konstruktoren im Überblick
MethodeTypDaten im RAM
Attachment.fromBytes(data, mime)In-MemoryGesamte Bytes
Attachment.fromFile(path, mime)File-PathGeöffnet als Stream beim Lesen
Attachment.fromStreamSupplier(...)Lazy-StreamNur die aktuell gelesenen Chunks
Attachment.builder().shouldBeChunked(true).build()Beliebig + ChunkingNur ein Chunk
Limits
  • max. 100 Attachments / Fragmente pro Submission oder Reply
  • max. 500 MB für ein einzelnes Attachment oder Fragment
  • max. 2 GB Gesamtgröße aller Anhänge einer Submission
Storage-Pfad konfigurieren

Während des Chunkings werden Fragmente temporär im Dateisystem abgelegt. Pfad und Bereinigung lassen sich konfigurieren:

sdkSettings:
attachmentChunkingConfig:
attachmentStoragePath: "/var/lib/fit-connect"
// programmatisch: AttachmentChunkingConfig.builder().attachmentStoragePath(Path.of("/var/lib/fit-connect")).build()

sdk.manage().attachments().purgeAllAttachments(); // Anhangspeicher aufräumen
sdk.manage().attachments().getStorageStatistics();
Häufige Stolperfallen
  • Schema-Version: Wenn der Zustellpunkt nur Schema < 1.3.0 unterstützt, schlägt der Versand mit Chunking fehl. Vorher prüfen mit destinations.getDestination(id) und im Feld metadataVersions nachschauen.
  • Plattenplatz: Der Storage-Pfad muss genug Platz für die Fragmente einer in-flight-Submission haben (typischerweise = Größe des größten Attachments).
  • getDataAsBytes() / Data-Array bei großem Attachment: Bricht entweder mit OutOfMemory oder überschreitet das Java-Array-Limit von ~2 GB. Stream verwenden.