Der Backend Versandstatus Rückmeldung-Service ist ein Service, der Statusinformationen zum Versand einer von der B2B in den Markt gesendeten Nachricht an konfigurierte Backend-Systeme (z.B. MK-Gateway, Prophet) zurückmeldet.

Beschreibung

Der Service bietet die folgende integrative Funktion zwischen B2B, AS4-Modul und angebundenen Backend-Systemen (z.B. MK-Gateway (kurz: MKG) oder EMS-EDM Prophet) beim Versand von Marktnachrichten über die B2B:

Wird eine Nachricht von einem Backend-System über die B2B in den Markt gesendet, so wird der Status des Versands der Nachricht samt Meta-Informationen per REST an das entsprechende Backend zurückgemeldet. Die Zuordnung zu einem Backend erfolgt über die channelId der B2B-Nachricht. Nur Nachrichten, deren channelId in der Konfiguration einem Backend zugeordnet ist, werden zurückgemeldet.

Zusätzlich wird nur der Status für Nachrichten zurückgemeldet, zu denen eine Referenznummer (z.B. im Fall der Verwendung von MKG die verwendete MRSLOTNR) in der B2B als alternativeId gespeichert wurde. So wird kein Übertragungsstatus für durch die B2B erzeugte CONTRLs oder APERAKs übertragen.

Die B2B entscheidet anhand ihrer Marktpartner-Daten, ob der marktkonforme Versand der Nachricht per Mail, AS2 oder AS4 stattfindet.

Im Falle eines Mail- oder AS2-Versands wird der Service am Ende der Nachrichten-Verarbeitung in der B2B getriggert. Technisch genauer: Per RESTClientService wird der Nachrichten-Trigger Endpunkt des b2b-message-services angesprochen, welcher als AMQP Adapter dient und die Nachricht in eine Queue schreibt. Der Backend-Versandstatus-Rückmeldung-Service sammelt dann die benötigten Informationen zum Nachrichtenversand aus der B2B zusammen, bringt sie in das für das Zielsystem gewünschte Format und meldet sie zurück.

Im Fall eines AS4-Versands wird der Service per Message-Broker Exchange-Konfiguration direkt aus dem AS4-Modul heraus getriggert. Genauer geschieht dies dann, wenn der as4-message-service die versendete AS4-Nachricht und das zugehörige Receipt in der B2B speichern möchte.

An das Backend werden neben dem Status (erfolgreich/nicht erfolgreich) zum Versand der Nachricht im Markt noch (abhängig vom Typ des Zielsystems) weitere Zusatzinformationen zurückgemeldet, wie

  • das Protokoll (Mail, AS2, AS4)
  • der Zeitpunkt des Versands (im Erfolgsfall)
  • die B2B Nachrichten-ID (zur eindeutigen Zuordnung zur Nachricht)
  • der verwendete Endpunkt im Markt (AS4- oder AS2-URL bzw. Mailaddresse im Erfolgsfall)
  • ein Fehlertext (im Fehlerfall)
  • die alternativeId der B2B Nachricht

Beispiel für eine Rückmeldung an das MKG:

{
    "messageId": "ab7035f1-a729-11ef-83f1-0242ac121234",
    "successful": true,
    "errorMessage": null,
    "protocolType": "AS4",
    "sentTime": "2025-11-01T10:25:52.338Z",
    "endpoint": "https://9903323000007.as4.makgw.seeburger.cloud:443",
    "alternativeId": "myMRSlotNr"
}

Beispiel für eine Rückmeldung an EMS-EDM Prophet:

{
    "successful": true,
    "errorMessage": null,
    "sentTime": "2025-11-01T10:25:52.338Z",
    "alternativeId": 12345
}

Installation

Der Service wird als Docker Image und Helm Chart (kostenpflichtig/bei entsprechender Berechtigung) bereitgestellt.

Entsprechende Helm Charts können bei Bedarf angefordert und bereitgestellt werden.

Konfiguration

Der Service wird über die folgenden Umgebungsvariablen aus der application.yml konfiguriert.

Dabei müssen im Wesentlichen die technischen Schnittstellen konfiguriert werden:

  • die RabbitMQ Verbindung
  • die B2B (abgesichert via OAuth2 mit angelegter Keycloak Client Konfiguration)
  • die Backend-Systeme (z.B. MKG, Prophet), jeweils abgesichert via Basic Auth
  • die Zuordnung von B2B-Kanälen zu den Backend-Systemen

über application.yml

spring:
  # RabbitMQ
  cloud:
    function:
      definition: consumeSentMessageEvent
    stream:
      bindings:
        consumeSentMessageEvent-in-0.destination: ${messaging.sentMessageExchangeName}
        consumeSentMessageEvent-in-0.group: ${messaging.sentMessageConsumerGroup}
        consumeSentMessageEvent-in-0.consumer.max-attempts: ${messaging.consumerMaxAttempts}
      rabbit:
        bindings:
          consumeSentMessageEvent-in-0.consumer.exchange-type: topic
          consumeSentMessageEvent-in-0.consumer.quorum.enabled: true
          consumeSentMessageEvent-in-0.consumer.auto-bind-dlq: true
          consumeSentMessageEvent-in-0.consumer.dlq-quorum.enabled: true
  rabbitmq:
    host: rabbit-host
    port: 5672
    username: rabbitmqUser
    password: rabbitmqPassword
  # Keycloak client
  security:
    oauth2:
      client:
        provider:
          keycloak:
            issuer-uri: http://keycloak-server:8080/auth/realms/pks
        registration:
          keycloak:
            provider: keycloak
            client-id: backend-transmission-status-sender
            client-secret: meinClientSecret
            authorization-grant-type: client_credentials
      resourceserver:
        jwt:
          issuer-uri: http://keycloak-server:8080/auth/realms/pks

# RabbitMQ messaging default configurations
messaging:
  sentMessageExchangeName: b2b.message.reference
  sentMessageConsumerGroup: default
  consumerMaxAttempts: 1

b2b:
  url: http://b2b-server:8080

# Backend-Systeme
backends:
  configs:
    MKG:
      url: http://mkg-server:8080
      username: admin
      password: 123456
      connect-timeout: 10000
    PROPHET:
      url: http://prophet-server:8081
      username: prophet_user
      password: prophet_secret
      connect-timeout: 10000

# Channel-Mappings
channel-mappings:
  mappings:
    - channel: OUT-MKG
      backend: MKG
    - channel: OUT-PROPHET
      backend: PROPHET

server:
  servlet:
    contextPath: /backend-transmission-status-sender

über Umgebungsvariablen

SPRING_RABBITMQ_HOST: "rabbit-host"
SPRING_RABBITMQ_PORT: "5672"
SPRING_RABBITMQ_USERNAME: "rabbitmqUser"
SPRING_RABBITMQ_PASSWORD: "rabbitmqPassword"
SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KEYCLOAK_ISSUER_URI: "http://keycloak-server:8080/auth/realms/pks"
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI: "http://keycloak-server:8080/auth/realms/pks"
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KEYCLOAK_CLIENT_ID: "backend-transmission-status-sender"
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KEYCLOAK_CLIENT_SECRET: "meinClientSecret"
B2B_URL: "http://b2b-server:8080"
BACKENDS_CONFIGS_PROPHET_URL: "http://dummy/receive"
BACKENDS_CONFIGS_PROPHET_USERNAME: "admin"
BACKENDS_CONFIGS_PROPHET_PASSWORD: "123456"
BACKENDS_CONFIGS_MKG_URL: "http://mkg-server:8080"
BACKENDS_CONFIGS_MKG_USERNAME: "admin"
BACKENDS_CONFIGS_MKG_PASSWORD: "123456"
MESSAGING_SENTMESSAGEEXCHANGENAME: "as4.receipt.outbound"
CHANNELMAPPINGS_MAPPINGS_0_CHANNEL: "OUT_B2B_MSG_SERVICE"
CHANNELMAPPINGS_MAPPINGS_0_BACKEND: "PROPHET"
CHANNELMAPPINGS_MAPPINGS_1_CHANNEL: "OUT_MKG"
CHANNELMAPPINGS_MAPPINGS_1_BACKEND: "MKG"

Release Notes

2026-01-20

Typ Ticket Beschreibung
Story BTOB-13631 Initiale Implementierung des backend-transmission-status-sender. Der Service kann einen Versandstatus an verschiedene Backend-Systeme (z.B. MKG, Prophet) basierend auf konfigurierbaren Channel-Mappings senden.
View Me   Edit Me