[JAVA] Exécutez DMN à l'aide du moteur Camunda DMN

Qu'est-ce que DMN (Decision Modeling and Notation)?

Il s'agit d'une notation de modélisation pour la prise de décision définie par OMG (Object Managemnt Group). Ces dernières années, il a attiré l'attention en tant que méthode d'automatisation des décisions dans la partie connaissance de la RPA.

https://www.omg.org/spec/DMN/About-DMN/

La principale caractéristique de DMN est que vous pouvez exécuter le modèle de décision écrit d'une manière facile à comprendre pour les humains. Vous pouvez tester le fonctionnement du DMN avec le simulateur DMN de Camunda (https://camunda.com/dmn/simulator/). Dans cet échantillon, le plat optimal (plat) est déterminé en fonction de la saison et du nombre d'invités, et la boisson optimale (boissons) est déterminée en fonction du plat et des invités avec enfants. Faire. «Optimal» signifie ici basé sur une logique prédéterminée (connaissance des entreprises et des individus). DMN donne cette logique dans une table appelée table de décision. Pour plus d'informations, veuillez consulter ici.

Essayez de définir le tableau de décision sur les boissons, les invités avec enfants sur vrai, la saison jusqu'à l'automne et le nombre d'invités sur 2. Deux boissons, Aecht Schlenkerla Rauchbier et Apple Juice, ont été produites comme ci-dessous. À partir de l'écran, vous pouvez voir que Spareribs a été sélectionné comme plat répondant aux conditions saisies. La bière allemande Aecht Schlenkerla Rauchbier a été choisie comme boisson pour accompagner les Spareribs. Le jus de pomme est pour les enfants, n'est-ce pas? C'est le résultat de la sélection de la boisson la plus appropriée à partir de la «connaissance» appelée table de décision en fonction de la saison saisie et du nombre d'invités.

image.png

Dans les coulisses de ce simulateur se trouve le moteur DMN Camunda exécutant le DMN. Cette fois, exécutez ce moteur DMN Camunda localement pour exécuter le DMN.

Préparation du fichier DMN

Cette fois, nous utiliserons l'exemple de fichier DMN de Camunda comme DMN pour la vérification. Téléchargez l'exemple de fichier DMN à partir de «Download DMN Table» sur la DMN Simulator Page. Un outil de conception DMN est nécessaire pour afficher et modifier les fichiers DMN. Personnellement, je recommande Camunda Modeler, qui est autonome et facile à utiliser. En passant, si vous souhaitez simplement exécuter DMN, vous n'avez besoin d'aucun outil de conception.

Obtention du moteur DMN Camunda

Le moteur DMN Camunda est publié sur Maven Central. Ajoutez la dépendance suivante au POM.

<dependency>
    <groupId>org.camunda.bpm.dmn</groupId>
    <artifactId>camunda-engine-dmn</artifactId>
</dependency>

Exécution de DMN avec le moteur Camunda DMN

Vous trouverez ci-dessous un exemple de code Java qui exécute DMN.

//Paramètres du chemin du fichier DMN et de l'ID de décision
String dmnFilePath = "./simulation.dmn";
String decisionId = "beverages";

//Paramètres des données d'entrée
Map<String, Object> input = new HashMap<String, Object>();
input.put("season", "Fall"); //l'automne
input.put("guestCount", 2);  //2 personnes
input.put("guestsWithChildren",true); //Avec des enfants

//Génération de moteurs DMN
DmnEngine dmnEngine = DmnEngineConfiguration.createDefaultDmnEngineConfiguration().buildEngine();

//Génération de décision
DmnDecision decision = dmnEngine.parseDecision(decisionId,new FileInputStream(dmnFilePath));

//Exécutez DMN
DmnDecisionResult result = dmnEngine.evaluateDecision(decision,input);

//Obtenir le résultat de l'exécution
for(Map<String,Object> entry : result.getResultList()) {
    System.out.println(entry.get("beverages"));
}

Ici, le decisionId est spécifié comme l'Id de la table de décision, qui est la valeur définie à l'emplacement suivant sur la table de décision affichée par Camunda Modeler.

image.png

L'entrée reçoit la même valeur que l'exemple d'exécution du simulateur DMN plus tôt. Lorsque j'exécute le code ci-dessus, j'obtiens le même résultat que le simulateur DMN comme ci-dessous.

Aecht Schlenkerla Rauchbier
Apple Juice

Ajouter une sortie

Etant donné que la sortie de la table de décision «boissons» est uniquement une boisson, vous ne pouvez obtenir des boissons qu'à cette table de décision. Mais de toute façon, je veux obtenir à la fois la nourriture et la boisson sélectionnées. Modifiez donc la table de décision pour augmenter la sortie. L'exemple ci-dessous utilise Camunda Modeler pour éditer la table de décision.

Ajoutez une colonne à la sortie des boissons comme indiqué ci-dessous. Ensuite, la valeur de Dish, qui est l'une des entrées de cette table de décision, est utilisée comme sortie. Le "plat souhaité" dans cette colonne de sortie signifie une référence à l'expression (nom de variable) du plat.

image.png

L'élément Input de la table de décision a Label, qui est une étiquette d'affichage, Expression, qui définit le nom de variable ou l'expression de la valeur, et Type, qui indique le type de données de la valeur. Dans Camunda Modeler, Expression ne s'affiche que si vous cliquez sur l'en-tête Entrée. Dans l'exemple de DMN, l'expression de la colonne Dish est désirée et utilisez cette valeur lors du référencement à partir d'autres colonnes.

image.png

Ensuite, réécrivez «Get Execution Result» dans le code Java ci-dessus afin que les aliments et les boissons puissent être affichés comme suit.

//Obtenir le résultat de l'exécution
for(Map<String,Object> entry : result.getResultList()) {
    System.out.println(entry.get("desiredDish") + " with " + entry.get("beverages"));
}

Le résultat de l'exécution est indiqué ci-dessous. Vous pouvez maintenant obtenir à la fois de la nourriture et des boissons.

Spareribs with Aecht Schlenkerla Rauchbier
Spareribs with Apple Juice

Recommended Posts

Exécutez DMN à l'aide du moteur Camunda DMN
Créez un fichier jar avec la commande
J'ai essayé d'exécuter facilement le moteur de recherche d'itinéraire (OSRM) avec un conteneur
Jusqu'à ce que vous exécutiez un programme Java avec le SDK AWS local sur Windows
Sortez avec un suffixe sur la méthode 2
Créer une carte multi-touches avec une bibliothèque standard
Refactoriser l'implémentation du pattern Decorator avec une interface fonctionnelle
Comment exécuter l'application SpringBoot en tant que service
[Tutoriel] Télécharger Eclipse → Lancer l'application avec Java (Pléiades)
L'histoire de la création d'un proxy inverse avec ProxyServlet
Exécutez Payara avec Docker
Comment faire une capture d'écran avec l'émulateur Android Studio
Créez une image Docker avec le JDK Oracle installé (miam
La première application WEB avec Spring Boot-Making a Pomodoro timer-
Une histoire remplie des bases de Spring Boot (résolu)
Vérifier le fonctionnement de deux rôles avec une application de chat
Exécutez PHP-FPM avec OPcache activé dans un conteneur en lecture seule
Exécutez plusieurs applications avec la même logique sous l'environnement Struts
[Swift 5] Sélectionnez une date avec le sélecteur UIDate sur iOS14
Exécuter l'analyse avec OpenJDK11 Java Flight Recorder + Google Kubernetes Engine
[Docker] Supprimer uniquement le volume associé à un conteneur spécifique
Expliquez les mérites du modèle d'État avec le jugement de notation du film
À propos du comportement lors de la création d'un mappage de fichiers avec Java
Trouvez le nombre de jours dans un mois avec Kotlin
Avec le logiciel que je fais depuis longtemps ...
Modéliser Digimon avec DDD pour la première fois Partie 1