Introduktion

Formål

Dette dokument beskriver hvordan man kommer i gang med at tilpasse eller videreudvikle EMR - EHMI MeddelelsesRegistrering.

Læsevejledning

Læser forventes at have kendskab til Java softwareudvikling med anvendelse af Maven, konfiguration af WildFly og brug af docker-compose.

Komponentens struktur

Selve komponenten er delt op i følgende moduler:

Komponenten indeholder følgende integrationer, som alle ligger under "msh_integrations":

Beskeder, kvitteringer og standarder

Dette afsnit giver et overblik over beskeder EMR henter og sender, hvordan de er pakket ind, og hvilke standarder der er i spil.

Hvad laver komponenten?

EMR fungerer som en bro mellem tre eksterne systemer:

Flowet er kø-baseret: Jobs kører i faste trin, og beskeder flyttes mellem interne DB-køer (ehmi_message_queue for forretningsbeskeder og kvitteringer, eds_message_queue for forsendelsesstatus). Der er ingen intern scheduler. Hvert job trigges udefra via en HTTP-servlet.

Beskeder ind og ud

Ind (hentes)

BeskedKildeHvordan
EHMI-forretningsbeskedDomibus

Fetch-jobbet henter ventende beskeder (listPendingMessages + retrieveMessage), parser dem og gemmer dem i køen som type EHMI.

Ud (sendes)

BeskedModtagerHvornår
Dokument-upload (ITI-41)DROSSave-jobbet uploader den indgående forretningsbesked til dokumentregisteret.
Kvittering (ReceiptAcknowledgement / ReceiptException)Domibus (retur til oprindelig afsender)Save-jobbet opretter kvitteringen og lægger den i køen som type RECEIPT. Send-jobbet sender den.
Forsendelsesstatus (FHIR AuditEvent)EDSAlle tre jobs skriver track-and-trace-hændelser til EDS-køen. Et separat EDS-job sender dem.

Bemærk: der er to forskellige ting, der begge kan kaldes "kvittering":

Kvitteringer til modparten

En kvittering er selv en EHMI StandardBusinessDocument (se indpakning nedenfor). Der findes to slags:

Kvitteringen korrelerer til den oprindelige besked, og retningen vendes: Afsender og modtager byttes om, så kvitteringen går tilbage til den, der sendte den oprindelige besked. Korrelationen bæres flere steder:

Sådan er en besked pakket ind

En besked består af tre indpakningslag: Ydre, indre og payload. De to sidste lag er begge base64-encoded.

TODOTegning af indpakning.




Konkret betyder det:

  1. Forretnings-payloaden base64-kodes ind i SBDH'ens BinaryContent.
  2. Hele SBDH-dokumentet serialiseres til XML og base64-kodes ind i ebMS-payloaden (PartInfo/value).
  3. Det hele lægges i en ebMS3 UserMessage og sendes som AS4 gennem Domibus.

Ved modtagelse foldes lagene ud i omvendt rækkefølge.

Centrale begreber

Begreberne stammer fra to forskellige lag: ebMS3 (den ydre AS4-konvolut) og SBDH (den indre EHMI-besked).

ebMS3-laget (AS4-konvolutten)

SBDH-laget (EHMI-beskeden)

Standarder og namespaces

Skemaerne ligger i msh_schema/src/main/resources/.

Relevante specifikationer:

Hvor i koden

Vigtige klasser i koden hvor de enkelte dele af besked-flowet håndteres:

Opsætning af udviklingsmiljø

Projektet ligger som nspop git-repository på følgende adresse: 

Som en del af projektet, leveres der også en konfiguration af Domibus, som skal anvendes af NSP. Den findes også i git:

EMR er udviklet i java 21 og kan bygges med.

mvn clean install

Som en del af bygget afvikles der unit tests.

Afvikling

Maven bygger war-filerne, som kan deployes med docker compose. Dette gøres lokalt med kommandoen:

docker-compose -f compose/development/docker-compose.yaml up --build

Herefter vil EMR  services være tilgængelig under http://localhost:8092/msh-adapter/.

Det er muligt at sætte en remote debugger op på port 5056.

Integrationstests

Integrationstesten kan afvikles op imod et kørende system på localhost med følgende kommando:

mvn verify -pl msh_integration_tests -Pintegration-test

Pt. er det et udestående omkring at definerer profiler, så testen kan køre mod udviklingsmiljøerne på test1 og test2, da disse i skrivende stund endnu ikke er deployed.

Projektstruktur

For nærmeste beskrivelse af projektets struktur og opbygning, se Design- og Arkitekturbeskrivelsen.

Database

Databasemodellen styres ved hjælp af liquibase. Det betyder, at når der skal laves ændringer til databasen, så må man ikke rette i de eksisterende skemafiler. I stedet skal der laves nye filer, der beskriver ændringerne.