Processo BPMN richiamato da Java
Il mio microservizio ha un endpoint Rest (getLocationForCar ()) dove accetta un Car DTO (come sotto) come input, ha una logica di business per trovare l'auto in una posizione e restituisce il Location DTO (come sotto).
class Car {
String carId;
String carName;
String carType;
String carModel;
String carMake;
}
class Location {
String locationId;
String locationType;
String locationAddress;
}
Voglio spostare la logica aziendale su BPMN e DMN. Sono nuovo in BPMN e DMN. Ho seguito alcuni tutorial di Camunda e ho pensato che fosse così che avrei potuto farlo funzionare con Camunda:
- Crea una tabella DMN hardcoded con input = carId e output = locationId.
- Crea un diagramma BPMN con estensione
- inizio ->
- estrae carId dal Car DTO passato al servizio web Rest (getLocationForCar ()) ->
- chiama DMN per dargli l'ID auto ->
- invia l'output di DMN al processo java in modo che possa essere inviato come risposta del servizio web (getLocationForCar ())
Questo approccio ha problemi (ho bisogno di aiuto per ottenere risposte alle seguenti domande):
- Come chiamare un processo BPMN dal codice del servizio Web Java Rest?
- Come passare Car Object a BPMN in modo che possa estrarre il carId, usarlo nella tabella DMN e ottenere l'output?
- Come il codice Java riceverà l'output dal processo BPMN o dalla tabella DMN, che può essere utilizzato per restituire l'oggetto risposta richiesto
Usare Camunda (libreria di terza parte) sembra un sovraccarico perché Camunda gira sul proprio server e bpmn, dmn sono distribuiti su quello, questo rallenterebbe il mio processo. Quindi sono più propenso a JBPM (anche se non ho idea se posso soddisfare i miei requisiti utilizzando uno di questi).
Risposte
DMN è un buon modo per estrarre la logica aziendale. Imho Camunda è la migliore possibilità leggera e gratuita per farlo.
Ecco un esempio per te
- Usa solo queste due dipendenze:
org.camunda.bpm.dmn: camunda-engine-dmn
org.camunda.bpm.dmn: camunda-engine-dmn-bom
- Crea DmnEngine:
DmnEngine dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
- Crea file DMN con Camunda Modeler (è gratuito).
- Preparare le variabili per la valutazione delle decisioni:
VariableMap variables = Variables
.putValue("carId", carId)
.putValue("carName", carName);
.putValue("carType", carType);
.putValue("carModel", carModel);
.putValue("carMake", carMake);
- Analizza la decisione dal passaggio 3 (copia il codice XML da Camunda Modeler e incollalo in un nuovo file xml nel tuo progetto)
InputStream inputStream = CarDecider.class.getResourceAsStream("carDecisionFile.xml");
- Valuta la decisione
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());
}
}
}
Se si desidera utilizzare diagrammi DMN più complessi, è possibile utilizzare il grafico dei requisiti decisionali (vedere: https://docs.camunda.org/manual/7.6/reference/dmn11/drg/). Con Camunda puoi avere più valori di output, come ne hai bisogno nel tuo esempio. Inoltre, puoi usare le estensioni per Camunda, come Feel Scala, con le quali puoi usare le funzioni nei tuoi file DMN. Inoltre puoi scrivere le tue funzioni personalizzate per DMN. Con questo approccio non è necessario utilizzare la piattaforma Camunda. Solo con 2 dipendenze puoi spostare la tua logica in quei file DMN. Con Camunda Modeler puoi caricare file dmn: ad esempio puoi creare un microservizio che riceve quei file e li salva in un database. Il tuo micro servizio DmnEngine caricherà quei file e valuterà la decisione.