Processus BPMN appelé par Java
Mon microservice a un point de terminaison Rest (getLocationForCar ()) où il accepte un DTO de voiture (comme ci-dessous) comme entrée, a une logique métier pour trouver la voiture à un emplacement et renvoie le DTO de localisation (comme ci-dessous).
class Car {
String carId;
String carName;
String carType;
String carModel;
String carMake;
}
class Location {
String locationId;
String locationType;
String locationAddress;
}
Je souhaite déplacer la logique métier vers BPMN et DMN. Je suis nouveau sur BPMN et DMN. J'ai parcouru quelques tutoriels de Camunda et j'ai pensé que c'était ainsi que je pourrais faire fonctionner cela avec Camunda:
- Créez une table DMN codée en dur avec input = carId et output = locationId.
- Créez un diagramme BPMN qui a un
- démarrer ->
- extraire carId du DTO Car qui est passé au webservice Rest (getLocationForCar ()) ->
- appelez DMN pour lui donner le carId ->
- envoyer la sortie de DMN au processus java afin qu'il puisse être envoyé en tant que réponse webservice (getLocationForCar ())
Cette approche pose des problèmes (j'ai besoin d'aide pour obtenir les réponses aux questions suivantes):
- Comment appeler un processus BPMN à partir du code java Rest Webservice?
- Comment passer Car Object à BPMN afin qu'il puisse extraire le carId, l'utiliser dans la table DMN et obtenir la sortie?
- Comment le code java obtiendra la sortie du processus BPMN ou de la table DMN, qui peut être utilisé pour renvoyer l'objet de réponse requis
L'utilisation de Camunda (bibliothèque de troisième partie) semble être une surcharge car Camunda fonctionne sur son propre serveur et que bpmn, dmn sont déployés sur cela, cela ralentirait mon processus. Je me penche donc davantage vers JBPM (même si je n'ai aucune idée si je peux répondre à mes besoins en utilisant l'un de ceux-ci).
Réponses
DMN est un bon moyen d'extraire votre logique métier. Imho Camunda est la meilleure possibilité légère et gratuite de le faire.
Voici un exemple pour vous
- Utilisez simplement ces deux dépendances:
org.camunda.bpm.dmn: camunda-engine-dmn
org.camunda.bpm.dmn: camunda-engine-dmn-bom
- Créez DmnEngine:
DmnEngine dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
- Créez un fichier DMN avec Camunda Modeler (est gratuit).
- Préparez les variables pour l'évaluation des décisions:
VariableMap variables = Variables
.putValue("carId", carId)
.putValue("carName", carName);
.putValue("carType", carType);
.putValue("carModel", carModel);
.putValue("carMake", carMake);
- Analyse de la décision de l'étape 3 (copiez le code XML de Camunda Modeler et collez-le dans un nouveau fichier xml dans votre projet)
InputStream inputStream = CarDecider.class.getResourceAsStream("carDecisionFile.xml");
- Évaluer la décision
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());
}
}
}
Si vous souhaitez utiliser des diagrammes DMN plus complexes, vous pouvez utiliser le graphique des exigences de décision (voir: https://docs.camunda.org/manual/7.6/reference/dmn11/drg/). Avec Camunda, vous pouvez avoir plusieurs valeurs de sortie, comme vous en avez besoin dans votre exemple. De plus, vous pouvez utiliser des extensions pour Camunda, comme Feel Scala, avec lesquelles vous pouvez utiliser des fonctions dans vos fichiers DMN. De plus, vous pouvez écrire vos propres fonctions personnalisées pour DMN. Avec cette approche, vous n'avez pas besoin d'utiliser la plate-forme Camunda. Juste avec 2 dépendances, vous pouvez déplacer votre logique vers ces fichiers DMN. Avec Camunda Modeler, vous pouvez télécharger des fichiers dmn: par exemple, vous pouvez créer un microservice qui reçoit ces fichiers et les enregistre dans une base de données. Votre micro-service DmnEngine chargera ces fichiers et évaluera la décision.