Quy trình BPMN được Java gọi ra

Nov 07 2020

Microservice của tôi có điểm cuối Rest (getLocationForCar ()) nơi nó chấp nhận DTO của Ô tô (như bên dưới) làm đầu vào, có một số logic nghiệp vụ để tìm ô tô tại một vị trí và trả về DTO Vị trí (như bên dưới).

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

Tôi muốn chuyển logic nghiệp vụ sang BPMN và DMN. Tôi chưa quen với BPMN và DMN. Tôi đã xem qua một số hướng dẫn về Camunda và nghĩ rằng đây là cách tôi có thể làm cho điều này hoạt động với Camunda:

  1. Tạo bảng DMN được mã hóa cứng với input = carId và output = locationId.
  2. Tạo một biểu đồ BPMN có
    • bắt đầu ->
    • trích xuất carId từ Car DTO được chuyển đến Dịch vụ web Rest (getLocationForCar ()) ->
    • gọi DMN để cung cấp carId cho nó ->
    • gửi đầu ra của DMN tới quy trình java để nó có thể được gửi dưới dạng phản hồi dịch vụ web (getLocationForCar ())

Cách tiếp cận này có vấn đề (tôi cần trợ giúp để trả lời các câu hỏi sau):

  1. Làm thế nào để gọi một quy trình BPMN từ mã java Rest Webservice?
  2. Làm thế nào để chuyển Đối tượng Xe sang BPMN để nó có thể trích xuất carId, sử dụng nó trong bảng DMN và nhận đầu ra?
  3. Cách mã java sẽ nhận được đầu ra từ quy trình BPMN hoặc bảng DMN, có thể được sử dụng để trả về đối tượng phản hồi được yêu cầu

Việc sử dụng Camunda (thư viện phần thứ ba) có vẻ tốn kém vì Camunda chạy trên máy chủ của chính nó và bpmn, dmn được triển khai trên đó, điều này sẽ làm chậm quá trình của tôi. Vì vậy, tôi đang nghiêng nhiều hơn về JBPM (mặc dù tôi không biết liệu tôi có thể đạt được yêu cầu của mình bằng cách sử dụng bất kỳ cái nào trong số này hay không).

Trả lời

2 JetBrains Nov 08 2020 at 18:38

DMN là một cách tốt để trích xuất logic kinh doanh của bạn. Imho Camunda là lightweigt tốt nhất và khả năng miễn phí để làm điều đó.

Đây là một ví dụ cho bạn

  1. Chỉ cần sử dụng hai phụ thuộc này:

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

  1. Tạo DmnEngine:
DmnEngine dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
  1. Tạo tệp DMN với Camunda Modeler (miễn phí).
  2. Chuẩn bị các biến để đánh giá quyết định:
 VariableMap variables = Variables
      .putValue("carId", carId)
      .putValue("carName", carName);
      .putValue("carType", carType);
      .putValue("carModel", carModel);
      .putValue("carMake", carMake);
  1. Phân tích cú pháp quyết định từ bước 3 (sao chép mã XML từ Camunda Modeler và dán vào tệp xml mới trong dự án của bạn)
 InputStream inputStream = CarDecider.class.getResourceAsStream("carDecisionFile.xml");
  1. Đánh giá quyết định
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());
      }
    }
  }

Nếu bạn muốn sử dụng các biểu đồ DMN phức tạp hơn, bạn có thể sử dụng Biểu đồ Yêu cầu Quyết định (xem: https://docs.camunda.org/manual/7.6/reference/dmn11/drg/). Với Camunda, bạn có thể có nhiều giá trị đầu ra, giống như bạn cần nó trong ví dụ của mình. Hơn nữa, bạn có thể sử dụng Tiện ích mở rộng cho Camunda, như Feel Scala, với đó bạn có thể sử dụng các chức năng trong tệp DMN của mình. Hơn nữa, bạn có thể viết các hàm tùy chỉnh của riêng mình cho DMN. Với cách tiếp cận này, bạn không cần sử dụng Nền tảng Camunda. Chỉ với 2 phụ thuộc, bạn có thể di chuyển logic của mình sang các tệp DMN đó. Với Camunda Modeler, bạn có thể tải lên các tệp dmn: ví dụ: bạn có thể tạo một microservice nhận các tệp đó và lưu chúng vào cơ sở dữ liệu. Dịch vụ vi mô DmnEngine của bạn sẽ tải các tệp đó và đánh giá quyết định.