Java에 의해 호출되는 BPMN 프로세스
내 마이크로 서비스에는 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와 함께 작동하는 방법이라고 생각했습니다.
- input = carId 및 output = locationId로 하드 코딩 된 DMN 테이블을 만듭니다.
- 다음이있는 BPMN 다이어그램을 만듭니다.
- 시작->
- Rest 웹 서비스 (getLocationForCar ())로 전달되는 Car DTO에서 carId 추출->
- DMN에 전화하여 carId를 제공하십시오->
- DMN의 출력을 자바 프로세스로 보내 웹 서비스 (getLocationForCar ()) 응답으로 보낼 수 있습니다.
이 접근 방식에는 문제가 있습니다 (다음 질문에 대한 답변을 얻는 데 도움이 필요합니다).
- Java Rest Webservice 코드에서 BPMN 프로세스를 호출하는 방법은 무엇입니까?
- Car Object를 BPMN에 전달하여 carId를 추출하고 DMN 테이블에서 사용하고 출력을 geturn하는 방법은 무엇입니까?
- Java 코드가 필요한 응답 객체를 반환하는 데 사용할 수있는 BPMN 프로세스 또는 DMN 테이블에서 출력을 얻는 방법
Camunda (세 번째 부분 라이브러리)를 사용하면 Camunda가 자체 서버에서 실행되고 bpmn, dmn이 배포되므로 오버 헤드처럼 보입니다. 이로 인해 프로세스가 느려질 수 있습니다. 그래서 나는 JBPM에 더 기울고 있습니다 (이들 중 하나를 사용하여 내 요구 사항을 달성 할 수 있는지 모르겠지만).
답변
DMN은 비즈니스 로직을 추출하는 좋은 방법입니다. Imho Camunda는 그것을 할 수있는 최고의 lightweigt이고 자유로운 가능성입니다.
여기 당신을위한 예
- 이 두 가지 종속성을 사용하십시오.
org.camunda.bpm.dmn : camunda-engine-dmn
org.camunda.bpm.dmn : camunda-engine-dmn-bom
- DmnEngine 생성 :
DmnEngine dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
- Camunda Modeler로 DMN 파일을 생성합니다 (무료).
- 의사 결정 평가를위한 변수 준비 :
VariableMap variables = Variables
.putValue("carId", carId)
.putValue("carName", carName);
.putValue("carType", carType);
.putValue("carModel", carModel);
.putValue("carMake", carMake);
- 3 단계의 결정 구문 분석 (Camunda Modeler에서 XML 코드를 복사하여 프로젝트의 새 xml 파일에 붙여 넣기)
InputStream inputStream = CarDecider.class.getResourceAsStream("carDecisionFile.xml");
- 결정 평가
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 마이크로 서비스는 해당 파일을로드하고 결정을 평가합니다.