กระบวนการ BPMN เรียกใช้โดย Java
ไมโครเซอร์วิสของฉันมีจุดสิ้นสุดของส่วนที่เหลือ (getLocationForCar ()) ซึ่งยอมรับ Car DTO (ตามด้านล่าง) เป็นอินพุตมีตรรกะทางธุรกิจบางอย่างในการค้นหารถในสถานที่และส่งคืนตำแหน่ง 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
- สร้างตาราง DMN แบบฮาร์ดโค้ดด้วย input = carId และ output = locationId
- สร้างแผนภาพ BPMN ซึ่งมีไฟล์
- เริ่ม ->
- แยก carId จาก Car DTO ที่ส่งผ่านไปยัง Rest webservice (getLocationForCar ()) ->
- โทรหา DMN เพื่อให้ carId กับมัน ->
- ส่งเอาต์พุตของ DMN ไปยังกระบวนการ java เพื่อให้สามารถส่งเป็นการตอบสนองของ webservice (getLocationForCar ())
แนวทางนี้มีปัญหา (ฉันต้องการความช่วยเหลือในการตอบคำถามต่อไปนี้):
- จะเรียกกระบวนการ BPMN จากรหัส Java Rest Webservice ได้อย่างไร
- จะส่ง Car Object ไปยัง BPMN ได้อย่างไรเพื่อให้สามารถแยก carId ใช้ในตาราง DMN และส่งเอาต์พุตได้
- วิธีที่โค้ด java จะได้รับเอาต์พุตจากกระบวนการ BPMN หรือตาราง DMN ซึ่งสามารถใช้เพื่อส่งคืนอ็อบเจ็กต์การตอบสนองที่ต้องการ
การใช้ Camunda (ไลบรารีส่วนที่สาม) ดูเหมือนจะเป็นค่าใช้จ่ายเนื่องจาก Camunda ทำงานบนเซิร์ฟเวอร์ของตัวเองและ bpmn มีการปรับใช้ dmn ซึ่งจะทำให้กระบวนการของฉันช้า ดังนั้นฉันจึงเอนเอียงไปที่ JBPM มากขึ้น (แม้ว่าฉันจะไม่รู้ว่าฉันสามารถบรรลุความต้องการของฉันโดยใช้สิ่งเหล่านี้ได้หรือไม่)
คำตอบ
DMN เป็นวิธีที่ดีในการแยกตรรกะทางธุรกิจของคุณ Imho Camunda เป็นอุปกรณ์ที่มีน้ำหนักเบาที่สุดและเป็นไปได้ฟรีที่จะทำเช่นนั้น
นี่คือตัวอย่างสำหรับคุณ
- เพียงใช้สองการอ้างอิงนี้:
org.camunda.bpm.dmn: camunda-engine-dmn
org.camunda.bpm.dmn: camunda-engine-dmn-bom
- สร้าง DmnEngine:
DmnEngine dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
- สร้างไฟล์ DMN ด้วย Camunda Modeler (ฟรี)
- เตรียมตัวแปรสำหรับการประเมินการตัดสินใจ:
VariableMap variables = Variables
.putValue("carId", carId)
.putValue("carName", carName);
.putValue("carType", carType);
.putValue("carModel", carModel);
.putValue("carMake", carMake);
- แยกวิเคราะห์การตัดสินใจจากขั้นตอนที่ 3 (คัดลอกโค้ด XML จาก Camunda Modeler และวางลงในไฟล์ 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 คุณสามารถมีค่าเอาต์พุตได้หลายค่าเช่นที่คุณต้องการในตัวอย่างของคุณ ยิ่งไปกว่านั้นคุณสามารถใช้ Extensions สำหรับ Camunda เช่น Feel Scala ซึ่งคุณสามารถใช้ฟังก์ชันในไฟล์ DMN ของคุณได้ นอกจากนี้คุณสามารถเขียนฟังก์ชันที่กำหนดเองสำหรับ DMN ได้ ด้วยวิธีนี้คุณไม่จำเป็นต้องใช้ Camunda Platform เพียงแค่มีการอ้างอิง 2 รายการคุณก็สามารถย้ายตรรกะของคุณไปยังไฟล์ DMN เหล่านั้นได้ ด้วย Camunda Modeler คุณสามารถอัปโหลดไฟล์ dmn: ตัวอย่างเช่นคุณสามารถสร้างไมโครเซอร์วิสที่รับไฟล์เหล่านั้นและบันทึกลงในฐานข้อมูล บริการไมโคร DmnEngine ของคุณจะโหลดไฟล์นั้นและประเมินการตัดสินใจ