簡體   English   中英

Java調用的BPMN流程

[英]BPMN process invoked by Java

我的微服務有一個 Rest 端點 (getLocationForCar()),它在輸入時接受汽車 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. 使用 input = carId 和 output = locationId 創建硬編碼的 DMN 表。
  2. 創建一個 BPMN 圖,它具有
    • 開始->
    • 從傳遞給 Rest webservice (getLocationForCar()) 的 Car DTO 中提取 carId ->
    • 調用 DMN 將 carId 提供給它 ->
    • 將 DMN 的輸出發送到 java 進程,以便它可以作為網絡服務 (getLocationForCar()) 響應發送

這種方法有問題(我需要幫助回答以下問題):

  1. 如何從 java Rest Webservice 代碼調用 BPMN 流程?
  2. 如何將 Car Object 傳遞給 BPMN,以便它可以提取 carId,在 DMN 表中使用它並獲取輸出?
  3. java 代碼如何從 BPMN 流程或 DMN 表中獲取輸出,可用於返回所需的響應對象

使用 Camunda(第三方庫)似乎是一種開銷,因為 Camunda 在它自己的服務器上運行,而 bpmn、dmn 部署在它上面,這會減慢我的進程。 所以我更傾向於 JBPM(雖然我不知道我是否可以使用這些中的任何一個來實現我的要求)。

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. 使用 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,您可以擁有多個輸出值,就像您在示例中需要的那樣。 此外,您可以使用 Camunda 擴展,例如 Feel Scala,這樣您就可以在 DMN 文件中使用函數。 此外,您可以為 DMN 編寫自己的自定義函數。 通過這種方法,您不需要使用 Camunda 平台。 只需使用 2 個依賴項,您就可以將邏輯移動到那些 DMN 文件中。 使用 Camunda Modeler,您可以上傳 dmn 文件:例如,您可以創建一個微服務來接收這些文件並將它們保存在數據庫中。 您的 DmnEngine 微服務將加載該文件並評估決策。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM