Proceso BPMN invocado por Java

Nov 07 2020

Mi microservicio tiene un punto final de descanso (getLocationForCar ()) donde acepta un DTO de automóvil (como se muestra a continuación) como entrada, tiene alguna lógica comercial para encontrar el automóvil en una ubicación y devuelve el DTO de ubicación (como se muestra a continuación).

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

Quiero trasladar la lógica empresarial a BPMN y DMN. Soy nuevo en BPMN y DMN. Pasé por algunos tutoriales de Camunda y pensé que así es como podría hacer que esto funcione con Camunda:

  1. Cree una tabla DMN codificada con input = carId y output = locationId.
  2. Cree un diagrama BPMN que tenga un
    • inicio ->
    • extraer carId del Car DTO que se pasa al servicio web Rest (getLocationForCar ()) ->
    • llame a DMN para darle la tarjeta ->
    • enviar la salida de DMN al proceso de Java para que pueda enviarse como una respuesta de servicio web (getLocationForCar ())

Este enfoque tiene problemas (necesito ayuda para obtener respuestas a las siguientes preguntas):

  1. ¿Cómo llamar a un proceso BPMN desde el código del servicio web Java Rest?
  2. ¿Cómo pasar Car Object a BPMN para que pueda extraer el carId, usarlo en la tabla DMN y obtener la salida?
  3. Cómo el código java obtendrá la salida del proceso BPMN o la tabla DMN, que se puede usar para devolver el objeto de respuesta requerido

Usar Camunda (biblioteca de la tercera parte) parece una sobrecarga porque Camunda se ejecuta en su propio servidor y bpmn, dmn se implementan en eso, esto ralentizaría mi proceso. Así que me estoy inclinando más hacia JBPM (aunque no tengo idea de si puedo lograr mi requisito usando alguno de estos).

Respuestas

2 JetBrains Nov 08 2020 at 18:38

DMN es una buena forma de extraer la lógica de su negocio. Imho Camunda es la mejor posibilidad ligera y gratuita para hacer eso.

Aquí un ejemplo para ti

  1. Simplemente use estas dos dependencias:

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

  1. Crear DmnEngine:
DmnEngine dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
  1. Cree un archivo DMN con Camunda Modeler (es gratis).
  2. Prepare variables para la evaluación de decisiones:
 VariableMap variables = Variables
      .putValue("carId", carId)
      .putValue("carName", carName);
      .putValue("carType", carType);
      .putValue("carModel", carModel);
      .putValue("carMake", carMake);
  1. Analice la decisión del paso 3 (copie el código XML de Camunda Modeler y péguelo en un nuevo archivo xml en su proyecto)
 InputStream inputStream = CarDecider.class.getResourceAsStream("carDecisionFile.xml");
  1. Evaluar decisión
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 desea utilizar diagramas DMN más complejos, puede utilizar el Gráfico de requisitos de decisión (consulte: https://docs.camunda.org/manual/7.6/reference/dmn11/drg/). Con Camunda puede tener múltiples valores de salida, como los necesita en su ejemplo. Además, puede usar Extensiones para Camunda, como Feel Scala, con las que puede usar funciones en sus archivos DMN. Además, puede escribir sus propias funciones personalizadas para DMN. Con este enfoque, no es necesario utilizar Camunda Platform. Solo con 2 dependencias puede mover su lógica a esos archivos DMN. Con Camunda Modeler puedes subir archivos dmn: por ejemplo puedes crear un microservicio que reciba esos archivos y los guarde en una base de datos. Su microservicio DmnEngine cargará esos archivos y evaluará la decisión.