Werkspur Docs Zur Website

Zielsysteme

Was ist das

Ein Zielsystem ist eine benannte, einmal hinterlegte Verbindung zu einem externen System. Aktionen rufen REST- und SOAP-Zielsysteme über rest.call und soap.call auf. Ein AMQP-Zielsystem stellt Verbindung und Anmeldung für amqp.publish oder für einen getrennt definierten eingehenden Listener bereit. Die Zugangsdaten stecken nie in der Aktion oder im Listener selbst, sondern am Zielsystem, und dort nur als Verweis auf ein Secret.

Sie legen ein Zielsystem einmal in der Verwaltung an und verwenden danach nur noch seinen Namen, in beliebig vielen Aktionen und Kommando-Schritten. Ändert sich die Adresse des externen Systems oder das dahinterliegende Secret, passen Sie allein das Zielsystem an. Die Aktionen, die es referenzieren, bleiben unverändert, denn sie kennen nur den Namen, nicht die Details dahinter. Der kind eines Zielsystems, rest, soap oder amqp, legt fest, welches Protokoll dahintersteckt und welche Felder die Definition zusätzlich braucht.

Ausgehende Kommando-Schritte verwenden Zielsysteme. Ein eingehender AMQP-Listener bleibt eine getrennte Definition: Er referenziert ein AMQP-Zielsystem, konsumiert eine Queue und erzeugt ein Ereignis für Trigger.

flowchart LR
    Action["Aktion"] --> RestCall["rest.call"]
    Action --> SoapCall["soap.call"]
    Action --> Publish["amqp.publish"]

    subgraph Destinations["Zielsysteme"]
        RestDest["REST-Zielsystem"]
        SoapDest["SOAP-Zielsystem"]
        AmqpDest["AMQP-Zielsystem"]
    end

    subgraph Listeners["Eingehende AMQP-Listener"]
        Listener["Listener"] --> Event["Ereignis"]
    end

    RestCall --> RestDest --> RestService["REST-Dienst"]
    SoapCall --> SoapDest --> SoapService["SOAP-Dienst"]
    Publish --> AmqpDest --> Broker["AMQP-Broker"]
    Broker -->|"Queue"| Listener
    Listener -.->|"referenziert Verbindung"| AmqpDest
    Event --> Trigger["Trigger"]

Wann einsetzen

Anatomie der Definition

Eine Zielsystem-Definition ist ein flaches JSON-Objekt:

Bei einem AMQP-Zielsystem tragen username und auth.secret gemeinsam die Zugangsdaten für die Broker-Verbindung. Der Benutzername steht offen in der Definition, das Passwort dagegen ausschließlich als Verweis auf ein Secret, nie als Klartext. Ein REST- oder SOAP-Zielsystem braucht kein username-Feld. Dort tragen auth.header und auth.secret gemeinsam die Authentifizierung, sofern das Zielsystem eine benötigt.

Bei einem SOAP-Zielsystem liest der Editor unter „Zielsysteme“ eine WSDL ein, wahlweise als Datei oder über eine URL. Er zeigt die gefundenen Operationen an und füllt base_url daraus vor. Die WSDL bleibt am Zielsystem gespeichert und hilft später dem Assistenten beim Formulieren neuer Aufrufe: Er liest sie über das Werkzeug describe_destination aus, das Zielnamensraum, Operationsliste und die rohe WSDL zurückgibt, noch bevor er einen soap.call-Schritt vorschlägt.

In einer Aktion binden Sie ein Zielsystem über den passenden Kommando-Schritt ein. rest.call setzt base_url und den am Schritt angegebenen Pfad zu einer vollständigen Adresse zusammen. Der Schritt wählt die Methode (GET, POST, PUT, PATCH oder DELETE) und extrahiert Antwortfelder per JSONPath in eine benannte extract-Zuordnung.

soap.call baut das vollständige SOAP Envelope aus einer Vorlage, setzt den SOAPAction-Header und liest die Antwort per XPath aus. Dabei ignoriert local-name() Namensräume in der Antwort. Meldet die Antwort einen SOAP-Fehler (Fault), wertet WERKSPUR das als Fehler mit Status 502 und bricht die Aktion ab. Die Namen aus extract werden Teil des Schrittergebnisses. Ein späterer Schritt liest sie über ${stepN.feld}, wobei N die Position des rest.call- oder soap.call-Schritts im Ablauf ist.

Beide Schritte laufen in derselben Transaktion wie der Rest der Aktion. Planen Sie externe Aufrufe deshalb früh im Ablauf ein und halten Sie sie kurz. Bei rest.call gilt ein Aufruf als unumkehrbar, wenn seine Methode Daten verändert, also nicht GET ist. Bei soap.call gilt dies unabhängig von der aufgerufenen Operation.

Ein unumkehrbarer, nicht letzter Schritt benötigt ein compensate, das den Aufruf bei einem späteren Fehler fachlich ausgleicht. Das Kapitel Aktionen zeigt einen solchen Fall: Ein rest.call zum Zielsystem erp bucht einen Materialverbrauch ab. Sein compensate nimmt die Buchung zurück, falls ein nachfolgender Schritt scheitert.

amqp.publish verwendet base_url, username und das über auth.secret gelöste Passwort. Der Schritt bekommt zusätzlich exchange, routing_key und body. Er wartet auf die Bestätigung des Brokers und ist immer unumkehrbar. Ein eingehender AMQP-Listener ist kein Feld dieses Schritts und kein Feld des Zielsystems. Er referenziert nur den Zielsystemnamen und ergänzt Queue sowie Ereignistyp.

Beispiele

erp destination
{
  "name": "erp",
  "kind": "rest",
  "base_url": "http://host.docker.internal:9100",
  "auth": {
    "header": "",
    "secret": ""
  }
}
Mit dem Assistenten
REST-Zielsystem für das ERP anlegen.

Ein Zielsystem vom Typ rest mit einer Basis-URL und ohne Authentifizierung. Die gebündelte Adresse gehört nur zur lokalen Beispielumgebung und ist kein Vorbild für eine echte Anbindung. Die Aktion fertigmeldung ruft das Zielsystem mit rest.call auf.

broker destination
{
  "name": "broker",
  "kind": "amqp",
  "base_url": "amqp://broker.werk.local:5672/",
  "username": "werkspur",
  "auth": {
    "header": "",
    "secret": "broker-passwort"
  }
}
Mit dem Assistenten
AMQP-Broker mit Benutzer und Secret anlegen.

Ein Zielsystem vom Typ amqp mit username und auth.secret als Namens-Verweis auf das Secret broker-passwort. Der eigentliche Wert des Secrets liegt nicht im Zielsystem, sondern im Secret-Speicher.

erp-soap destination
{
  "name": "erp-soap",
  "kind": "soap",
  "base_url": "https://erp.example.com/ws",
  "auth": {
    "header": "Authorization",
    "secret": "erp-soap-token"
  }
}
Mit dem Assistenten
SOAP-Webservice mit Auth-Header anlegen.

Ein Zielsystem vom Typ soap. auth.header bestimmt den Namen des Auth-Headers, auth.secret den Namens-Verweis auf dessen Wert.

Fallstricke

Wie eine Aktion einen externen Schritt in ihren Ablauf einbindet, zeigt das Kapitel Aktionen. Eingehenden Queue-Konsum beschreibt AMQP-Listener. Wie ein Trigger auf das daraus entstehende Ereignis reagiert, erklärt Trigger. Eine protokollspezifische Diagnosefolge finden Sie unter Integration: Fehlersuche.