Von Java aufgerufener BPMN-Prozess

Nov 07 2020

Mein Microservice hat einen Rest-Endpunkt (getLocationForCar ()), an dem er ein Auto-DTO (wie unten) als Eingabe akzeptiert, über eine Geschäftslogik verfügt, um das Auto an einem Ort zu finden, und das Standort-DTO (wie unten) zurückgibt.

class Car {
   String carId;
   String carName;
   String carType;
   String carModel;
   String carMake;
}
class Location {
   String locationId;
   String locationType;
   String locationAddress;
}

Ich möchte die Geschäftslogik auf BPMN und DMN verschieben. Ich bin neu bei BPMN und DMN. Ich habe einige Tutorials zu Camunda durchgesehen und dachte, so könnte ich das mit Camunda zum Laufen bringen:

  1. Erstellen Sie eine fest codierte DMN-Tabelle mit input = carId und output = locationId.
  2. Erstellen Sie ein BPMN-Diagramm mit a
    • Start ->
    • extrahieren Sie die carId aus dem Auto-DTO, das an den Rest-Webservice (getLocationForCar ()) übergeben wird ->
    • Rufen Sie DMN an, um die carId zu geben ->
    • Senden Sie die DMN-Ausgabe an den Java-Prozess, damit sie als Webservice-Antwort (getLocationForCar ()) gesendet werden kann

Dieser Ansatz weist Probleme auf (ich benötige Hilfe bei der Beantwortung der folgenden Fragen):

  1. Wie rufe ich einen BPMN-Prozess aus dem Java Rest Webservice-Code auf?
  2. Wie übergebe ich Car Object an BPMN, damit es die carId extrahieren, in der DMN-Tabelle verwenden und die Ausgabe zurückgeben kann?
  3. Wie der Java-Code vom BPMN-Prozess oder der DMN-Tabelle ausgegeben wird, kann verwendet werden, um das erforderliche Antwortobjekt zurückzugeben

Die Verwendung von Camunda (Bibliothek des dritten Teils) scheint ein Overhead zu sein, da Camunda auf einem eigenen Server ausgeführt wird und bpmn, dmn darauf bereitgestellt werden. Dies würde meinen Prozess verlangsamen. Ich neige also eher zu JBPM (obwohl ich keine Ahnung habe, ob ich meine Anforderungen mit diesen erfüllen kann).

Antworten

2 JetBrains Nov 08 2020 at 18:38

DMN ist ein guter Weg, um Ihre Geschäftslogik zu extrahieren. Imho Camunda ist die beste leichte und kostenlose Möglichkeit, dies zu tun.

Hier ein Beispiel für Sie

  1. Verwenden Sie einfach diese beiden Abhängigkeiten:

org.camunda.bpm.dmn: camunda-engine-dmn
org.camunda.bpm.dmn: camunda-engine-dmn-bom

  1. Erstellen Sie DmnEngine:
DmnEngine dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
  1. Erstellen Sie eine DMN-Datei mit Camunda Modeler (kostenlos).
  2. Bereiten Sie Variablen für die Entscheidungsbewertung vor:
 VariableMap variables = Variables
      .putValue("carId", carId)
      .putValue("carName", carName);
      .putValue("carType", carType);
      .putValue("carModel", carModel);
      .putValue("carMake", carMake);
  1. Analyseentscheidung aus Schritt 3 (XML-Code von Camunda Modeler kopieren und in eine neue XML-Datei in Ihrem Projekt einfügen)
 InputStream inputStream = CarDecider.class.getResourceAsStream("carDecisionFile.xml");
  1. Entscheidung bewerten
try {
      DmnDecision decision = dmnEngine.parseDecision("decision", inputStream);

      // evaluate decision
      DmnDecisionTableResult result = dmnEngine.evaluateDecisionTable(decision, variables);

      // print result
      String desiredLocation = result.getSingleResult().getSingleEntry();
      System.out.println("Decision: " + desiredLocation);

    }
    finally {
      try {
        inputStream.close();
      }
      catch (IOException e) {
        System.err.println("Could not close stream: "+e.getMessage());
      }
    }
  }

Wenn Sie komplexere DMN-Diagramme verwenden möchten, können Sie das Entscheidungsanforderungsdiagramm verwenden (siehe: https://docs.camunda.org/manual/7.6/reference/dmn11/drg/). Mit Camunda können Sie mehrere Ausgabewerte haben, wie Sie es in Ihrem Beispiel benötigen. Darüber hinaus können Sie Erweiterungen für Camunda wie Feel Scala verwenden, mit denen Sie Funktionen in Ihren DMN-Dateien verwenden können. Darüber hinaus können Sie Ihre eigenen benutzerdefinierten Funktionen für DMN schreiben. Bei diesem Ansatz müssen Sie die Camunda-Plattform nicht verwenden. Nur mit 2 Abhängigkeiten können Sie Ihre Logik in diese DMN-Dateien verschieben. Mit Camunda Modeler können Sie DMN-Dateien hochladen: Sie können beispielsweise einen Microservice erstellen, der diese Dateien empfängt und in einer Datenbank speichert. Ihr DmnEngine-Mikrodienst lädt diese Dateien und bewertet die Entscheidung.