CodamAIDocs
Themafertig

Eingebettet oder als eigener Dienst

Die zwei Betriebsarten von CRMS: eingebettet in eine CDMS-Anwendung oder als eigener Dienst, den andere über crms-client aufrufen. Eine Eigenschaft, zwei jars, und der Hub leitet ab, welche Art ein Projekt bekommt.

Ausprägungen
local (eingebettet)remote (eigener Dienst über crms-client)ohne CRMS

Worum es geht

CRMS läuft auf zwei Arten, genau wie CIAS:

  • eingebettet (local): CRMS läuft im selben Prozess wie eine CDMS-Anwendung. Die Anwendung ruft die Ports als Java-Methoden auf.
  • als eigener Dienst (remote): CRMS läuft als eigenes Programm. Andere Anwendungen rufen es über HTTP auf, mit crms-client.

Fachlich verhält sich CRMS in beiden Fällen gleich: dieselben Ports, dieselben Antworten, dieselben Fehlerschlüssel.

Die zwei Betriebsarten

localremote
Eigenschaftcodamai.crms.placement=localcodamai.crms.placement=remote
Auf dem KlassenpfadStarter, das eingebettete CRMS (bringt Vorlagenverwaltung, Renderer und Nachweis mit), die gewählten Formatmodule, die HTTP-Schnittstelle von CRMS und, solange endgültige Dokumente gespeichert werden, der S3-Speicher von CRMSStarter und crms-client, sonst nichts von CRMS
AufrufMethodenaufruf im selben ProzessHTTP an den CRMS-Dienst
Datenbankdie Datenbank der CDMS-Anwendungdie eigene Datenbank des Dienstes
Zeitgesteuerte Läufelaufen in der Anwendung: Verankerung und Aufbewahrunglaufen im CRMS-Dienst, nicht in der Anwendung
Vorlagen bearbeitenüber /crms/** der Anwendungdirekt über die Routen des CRMS-Dienstes

Die HTTP-Schnittstelle von CRMS gehört zur eingebetteten Art. Eine Anwendung, die CRMS einbettet, stellt damit /crms/** bereit, und andere Anwendungen können sie als CRMS-Dienst nutzen. Eine Anwendung mit remote darf diese Schnittstelle nicht haben. Sie würde sonst den Dienst über eigene Routen weiterreichen, hinter ihrer eigenen Sicherheit.

CIAS kennt dieselben zwei Bauformen, siehe CIAS eingebettet (eine Einheit).

Was beim Start geprüft wird

Der Starter prüft die Eigenschaft gegen den Klassenpfad, bevor irgendein anderer Teil von CRMS entsteht. Passt etwas nicht, startet die Anwendung nicht, und die Meldung sagt, welches jar fehlt oder zu viel ist.

Renderer von CRMS und crms-client zusammen?codamai.crms.placementKlassenpfadStart
ja––scheitert: einbetten oder aufrufen, nie beides
neinfehlt oder leer–scheitert: die Eigenschaft ist Pflicht
neinweder local noch remote–scheitert
neinlocaleingebettetes CRMS fehltscheitert
neinremotecrms-client fehltscheitert
neinremoteHTTP-Schnittstelle von CRMS vorhandenscheitert
neinlocaleingebettetes CRMS vorhandenCRMS eingebettet
neinremotecrms-client vorhandenCRMS über HTTP

Die Eigenschaft hat keinen Standardwert. Ein Projektrahmen, der sie vergessen hat, liefe sonst still mit der falschen Art.

In einem Native Image steht der Klassenpfad schon beim Bauen fest, die Eigenschaft wird erst beim Start gelesen. Das ist Absicht: Ein Native Image hat einen festen Klassenpfad, läuft aber in verschiedenen Umgebungen. Die Umgebungsvariable dazu heißt CODAMAI_CRMS_PLACEMENT.

Der Hub entscheidet

Ein Projekt im Hub hat höchstens ein CRMS-Modul. Wo du dieses Modul hinlegst, also in welche Laufzeit (das Programm, das später läuft), entscheidet über die Betriebsart jeder CDMS-Anwendung des Projekts. Es gibt kein Feld, in dem du local oder remote einträgst.

Hat das Projekt ein CRMS-Modul?Meldet sich die CDMS-Anwendung über CIAS an?Wo liegt das CRMS-Modul?Die CDMS-Anwendung
nein––ohne CRMS
janeinnicht in ihrer eigenen Laufzeitohne CRMS
janeinin ihrer eigenen LaufzeitBuild abgelehnt: CRMS braucht CIAS
jajain keiner LaufzeitBuild abgelehnt: das CRMS-Modul muss in eine Laufzeit
jajain ihrer eigenen Laufzeitlocal: CRMS eingebettet
jajain einer anderen Laufzeitremote: Client des CRMS dort

„In einer anderen Laufzeit“ heißt entweder ein eigener CRMS-Dienst oder eine andere CDMS-Anwendung des Projekts, in die CRMS eingebettet ist. Liegt das CRMS-Modul in einer Laufzeit ohne CDMS-Anwendung, entsteht daraus ein eigener CRMS-Dienst.

Der Build setzt dann die passenden Abhängigkeiten in die POM. Bei local kommen nur die Formatmodule der Formate hinein, die das CRMS-Modul gewählt hat. Bei remote kommt kein Formatmodul hinein, denn gerendert wird im Dienst.

Ein Aufruf über HTTP

Bei remote gilt eine Regel: Der Aufruf trägt die Person, nicht den Dienst. crms-client reicht das Zugriffstoken der Anfrage weiter, die die Anwendung gerade beantwortet. Ein eigenes Dienst-Token schickt es nie. So nennt jede Revision, jede Freigabe und jedes endgültige Dokument die Person, die es ausgelöst hat.

  1. 1
    Benutzer→Client
    klickt auf „Bericht erzeugen“
  2. 2
    Client→CDMS
    Anfrage mit Token: Authorization: Bearer …
  3. 3
    CDMS
    baut die Payload und ruft ReportRenderPort.render(…) auf
  4. 4
    CDMS
    läuft gerade eine Anfrage mit Token?
  5. 5
    CDMS
    kein Token, etwa in einem Hintergrundjob → crms-authentication-required, es wird nichts gesendet
  6. 6
    CDMS→CRMS
    crms-client schickt POST /crms/render mit demselben Token
  7. 7
    CRMS→Keycloak
    tauscht das Token gegen sein eigenes, mit den Rollen, die CRMS für diese Person kennt
  8. 8
    CRMS
    rendert wie eingebettet
  9. 9
    CRMS→CDMS
    antwortet mit dem Dokument
  10. 10
    CDMS→Client
    reicht das Ergebnis weiter
    Ergebnis: Dasselbe RenderedDocument oder dieselbe CrmsException wie eingebettet

crms-client übersetzt die Antwort zurück in dieselben Objekte und Fehler, die die eingebettete Art liefert. Ist der Dienst nicht erreichbar, läuft die Zeit ab oder kommt eine Antwort, die nicht von CRMS stammt, wird daraus crms-unavailable, nie ein halbes Ergebnis. Die Adresse des Dienstes steht in CODAMAI_CRMS_CLIENT_URL. Mehr unter Der Client.

Fallen

Weiter

Suchen