Processo BPMN invocado por Java

Nov 07 2020

Meu microsserviço tem um endpoint Rest (getLocationForCar ()) onde aceita um DTO de carro (como abaixo) como entrada, tem alguma lógica de negócios para encontrar o carro em um local e retorna o DTO de local (como abaixo).

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

Desejo mover a lógica de negócios para BPMN e DMN. Sou novo em BPMN e DMN. Passei por alguns tutoriais da Camunda e pensei que assim poderia fazer isso funcionar com a Camunda:

  1. Crie uma tabela DMN codificada com input = carId e output = locationId.
  2. Crie um diagrama BPMN que tem um
    • iniciar ->
    • extraia carId do DTO do carro que é passado para o serviço da web Rest (getLocationForCar ()) ->
    • ligue para DMN para fornecer o carId a ele ->
    • enviar a saída de DMN para o processo java para que possa ser enviada como uma resposta de serviço da web (getLocationForCar ())

Esta abordagem tem problemas (preciso de ajuda para obter respostas às seguintes perguntas):

  1. Como chamar um processo BPMN a partir do código java Rest Webservice?
  2. Como passar Car Object para o BPMN para que ele extraia o carId, use-o na tabela DMN e retorne a saída?
  3. Como o código java obterá a saída do processo BPMN ou da tabela DMN, que pode ser usado para retornar o objeto de resposta necessário

Usar Camunda (biblioteca de terceira parte) parece uma sobrecarga porque Camunda roda em seu próprio servidor e bpmn, dmn são implantados nele, isso tornaria meu processo lento. Portanto, estou mais inclinado para o JBPM (embora não tenha ideia se posso atingir meus requisitos usando algum deles).

Respostas

2 JetBrains Nov 08 2020 at 18:38

DMN é uma boa maneira de extrair sua lógica de negócios. Imho Camunda é a melhor possibilidade de peso leve e livre para isso.

Aqui está um exemplo para você

  1. Basta usar estas duas dependências:

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

  1. Crie DmnEngine:
DmnEngine dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
  1. Crie um arquivo DMN com o Camunda Modeler (é grátis).
  2. Prepare variáveis ​​para avaliação de decisão:
 VariableMap variables = Variables
      .putValue("carId", carId)
      .putValue("carName", carName);
      .putValue("carType", carType);
      .putValue("carModel", carModel);
      .putValue("carMake", carMake);
  1. Analise a decisão da etapa 3 (copie o código XML do Camunda Modeler e cole em um novo arquivo xml em seu projeto)
 InputStream inputStream = CarDecider.class.getResourceAsStream("carDecisionFile.xml");
  1. Avalie a decisão
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 você quiser usar diagramas DMN mais complexos, pode usar o Gráfico de Requisitos de Decisão (consulte: https://docs.camunda.org/manual/7.6/reference/dmn11/drg/) Com a Camunda você pode ter vários valores de saída, como você precisa no seu exemplo. Além disso, você pode usar Extensões para Camunda, como Feel Scala, com isso você pode usar funções em seus arquivos DMN. Além disso, você pode escrever suas próprias funções personalizadas para DMN. Com esta abordagem você não precisa usar a Plataforma Camunda. Apenas com 2 dependências, você pode mover sua lógica para esses arquivos DMN. Com o Camunda Modeler você pode fazer upload de arquivos dmn: por exemplo, você pode criar um microsserviço que recebe esses arquivos e os salva em um banco de dados. Seu micro serviço DmnEngine carregará esses arquivos e avaliará a decisão.