Java에 의해 호출되는 BPMN 프로세스

Nov 07 2020

내 마이크로 서비스에는 Car DTO (아래 참조)를 입력으로 받아들이는 Rest 엔드 포인트 (getLocationForCar ())가 있으며, 위치에서 자동차를 찾기위한 비즈니스 로직이 있으며 위치 DTO (아래 참조)를 반환합니다.

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

비즈니스 로직을 BPMN 및 DMN으로 옮기고 싶습니다. BPMN 및 DMN을 처음 사용합니다. Camunda에 대한 몇 가지 자습서를 살펴 보았고 이것이 Camunda와 함께 작동하는 방법이라고 생각했습니다.

  1. input = carId 및 output = locationId로 하드 코딩 된 DMN 테이블을 만듭니다.
  2. 다음이있는 BPMN 다이어그램을 만듭니다.
    • 시작->
    • Rest 웹 서비스 (getLocationForCar ())로 전달되는 Car DTO에서 carId 추출->
    • DMN에 전화하여 carId를 제공하십시오->
    • DMN의 출력을 자바 프로세스로 보내 웹 서비스 (getLocationForCar ()) 응답으로 보낼 수 있습니다.

이 접근 방식에는 문제가 있습니다 (다음 질문에 대한 답변을 얻는 데 도움이 필요합니다).

  1. Java Rest Webservice 코드에서 BPMN 프로세스를 호출하는 방법은 무엇입니까?
  2. Car Object를 BPMN에 전달하여 carId를 추출하고 DMN 테이블에서 사용하고 출력을 geturn하는 방법은 무엇입니까?
  3. Java 코드가 필요한 응답 객체를 반환하는 데 사용할 수있는 BPMN 프로세스 또는 DMN 테이블에서 출력을 얻는 방법

Camunda (세 번째 부분 라이브러리)를 사용하면 Camunda가 자체 서버에서 실행되고 bpmn, dmn이 배포되므로 오버 헤드처럼 보입니다. 이로 인해 프로세스가 느려질 수 있습니다. 그래서 나는 JBPM에 더 기울고 있습니다 (이들 중 하나를 사용하여 내 요구 사항을 달성 할 수 있는지 모르겠지만).

답변

2 JetBrains Nov 08 2020 at 18:38

DMN은 비즈니스 로직을 추출하는 좋은 방법입니다. Imho Camunda는 그것을 할 수있는 최고의 lightweigt이고 자유로운 가능성입니다.

여기 당신을위한 예

  1. 이 두 가지 종속성을 사용하십시오.

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

  1. DmnEngine 생성 :
DmnEngine dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
  1. Camunda Modeler로 DMN 파일을 생성합니다 (무료).
  2. 의사 결정 평가를위한 변수 준비 :
 VariableMap variables = Variables
      .putValue("carId", carId)
      .putValue("carName", carName);
      .putValue("carType", carType);
      .putValue("carModel", carModel);
      .putValue("carMake", carMake);
  1. 3 단계의 결정 구문 분석 (Camunda Modeler에서 XML 코드를 복사하여 프로젝트의 새 xml 파일에 붙여 넣기)
 InputStream inputStream = CarDecider.class.getResourceAsStream("carDecisionFile.xml");
  1. 결정 평가
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());
      }
    }
  }

더 복잡한 DMN 다이어그램을 사용하려는 경우 의사 결정 요구 사항 그래프를 사용할 수 있습니다 (참조 : https://docs.camunda.org/manual/7.6/reference/dmn11/drg/). Camunda를 사용하면 예제에서 필요한 것처럼 여러 출력 값을 가질 수 있습니다. 또한 Feel Scala와 같은 Camunda 용 Extensions를 사용할 수 있으며 DMN 파일에서 함수를 사용할 수 있습니다. 또한 DMN에 대한 사용자 정의 함수를 작성할 수 있습니다. 이 접근 방식을 사용하면 Camunda Platform을 사용할 필요가 없습니다. 2 개의 종속성만으로 로직을 해당 DMN 파일로 이동할 수 있습니다. Camunda Modeler를 사용하면 dmn 파일을 업로드 할 수 있습니다. 예를 들어 이러한 파일을 수신하고 데이터베이스에 저장하는 마이크로 서비스를 만들 수 있습니다. DmnEngine 마이크로 서비스는 해당 파일을로드하고 결정을 평가합니다.