กระบวนการ BPMN เรียกใช้โดย Java

Nov 07 2020

ไมโครเซอร์วิสของฉันมีจุดสิ้นสุดของส่วนที่เหลือ (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

  1. สร้างตาราง DMN แบบฮาร์ดโค้ดด้วย input = carId และ output = locationId
  2. สร้างแผนภาพ BPMN ซึ่งมีไฟล์
    • เริ่ม ->
    • แยก carId จาก Car DTO ที่ส่งผ่านไปยัง Rest webservice (getLocationForCar ()) ->
    • โทรหา DMN เพื่อให้ carId กับมัน ->
    • ส่งเอาต์พุตของ DMN ไปยังกระบวนการ java เพื่อให้สามารถส่งเป็นการตอบสนองของ webservice (getLocationForCar ())

แนวทางนี้มีปัญหา (ฉันต้องการความช่วยเหลือในการตอบคำถามต่อไปนี้):

  1. จะเรียกกระบวนการ BPMN จากรหัส Java Rest Webservice ได้อย่างไร
  2. จะส่ง Car Object ไปยัง BPMN ได้อย่างไรเพื่อให้สามารถแยก carId ใช้ในตาราง DMN และส่งเอาต์พุตได้
  3. วิธีที่โค้ด java จะได้รับเอาต์พุตจากกระบวนการ BPMN หรือตาราง DMN ซึ่งสามารถใช้เพื่อส่งคืนอ็อบเจ็กต์การตอบสนองที่ต้องการ

การใช้ Camunda (ไลบรารีส่วนที่สาม) ดูเหมือนจะเป็นค่าใช้จ่ายเนื่องจาก Camunda ทำงานบนเซิร์ฟเวอร์ของตัวเองและ bpmn มีการปรับใช้ dmn ซึ่งจะทำให้กระบวนการของฉันช้า ดังนั้นฉันจึงเอนเอียงไปที่ JBPM มากขึ้น (แม้ว่าฉันจะไม่รู้ว่าฉันสามารถบรรลุความต้องการของฉันโดยใช้สิ่งเหล่านี้ได้หรือไม่)

คำตอบ

2 JetBrains Nov 08 2020 at 18:38

DMN เป็นวิธีที่ดีในการแยกตรรกะทางธุรกิจของคุณ Imho Camunda เป็นอุปกรณ์ที่มีน้ำหนักเบาที่สุดและเป็นไปได้ฟรีที่จะทำเช่นนั้น

นี่คือตัวอย่างสำหรับคุณ

  1. เพียงใช้สองการอ้างอิงนี้:

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

  1. สร้าง DmnEngine:
DmnEngine dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
  1. สร้างไฟล์ DMN ด้วย Camunda Modeler (ฟรี)
  2. เตรียมตัวแปรสำหรับการประเมินการตัดสินใจ:
 VariableMap variables = Variables
      .putValue("carId", carId)
      .putValue("carName", carName);
      .putValue("carType", carType);
      .putValue("carModel", carModel);
      .putValue("carMake", carMake);
  1. แยกวิเคราะห์การตัดสินใจจากขั้นตอนที่ 3 (คัดลอกโค้ด XML จาก Camunda Modeler และวางลงในไฟล์ 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 คุณสามารถมีค่าเอาต์พุตได้หลายค่าเช่นที่คุณต้องการในตัวอย่างของคุณ ยิ่งไปกว่านั้นคุณสามารถใช้ Extensions สำหรับ Camunda เช่น Feel Scala ซึ่งคุณสามารถใช้ฟังก์ชันในไฟล์ DMN ของคุณได้ นอกจากนี้คุณสามารถเขียนฟังก์ชันที่กำหนดเองสำหรับ DMN ได้ ด้วยวิธีนี้คุณไม่จำเป็นต้องใช้ Camunda Platform เพียงแค่มีการอ้างอิง 2 รายการคุณก็สามารถย้ายตรรกะของคุณไปยังไฟล์ DMN เหล่านั้นได้ ด้วย Camunda Modeler คุณสามารถอัปโหลดไฟล์ dmn: ตัวอย่างเช่นคุณสามารถสร้างไมโครเซอร์วิสที่รับไฟล์เหล่านั้นและบันทึกลงในฐานข้อมูล บริการไมโคร DmnEngine ของคุณจะโหลดไฟล์นั้นและประเมินการตัดสินใจ