java - Java调用BPMN流程

标签 java jbpm bpmn camunda

我的微服务有一个 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. 创建一个硬编码的 DMN 表,其中输入 = carId,输出 = locationId。
  2. 创建一个 BPMN 图,其中包含
    • 开始 ->
    • 从传递给 Rest Web 服务的 Car DTO 中提取 carId (getLocationForCar()) ->
    • 调用 DMN 将 carId 提供给它 ->
    • 将 DMN 的输出发送到 java 进程,以便可以将其作为 Web 服务 (getLocationForCar()) 响应发送

这种方法有问题(我需要帮助来回答以下问题):

  1. 如何从 java Rest Webservice 代码调用 BPMN 流程?
  2. 如何将 Car 对象传递给 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

  • 创建 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,您可以拥有多个输出值,就像您在示例中需要的那样。 此外,您可以使用 Camunda 的扩展,例如 Feel Scala,这样您就可以在 DMN 文件中使用函数。此外,您还可以为 DMN 编写自己的自定义函数。 通过这种方法,您不需要使用 Camunda 平台。只需 2 个依赖项,您就可以将逻辑移动到这些 DMN 文件中。使用 Camunda Modeler,您可以上传 dmn 文件:例如,您可以创建一个微服务来接收这些文件并将其保存在数据库中。您的 DmnEngine 微服务将加载该文件并评估决策。

    关于java - Java调用BPMN流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64721175/

    相关文章:

    java - 如何使用 Apache POI 在 Word 文档中定义窄边距?

    java - 复杂的 Activiti + JPA 查询

    java - JBPM6 : How to resume a process from the last successful node after the server crash?

    jbpm - 项目构建错误: Unknown packaging: kjar

    bpmn - BPMN channel 上的多个实例

    c# - 在c#中用颜色填充visio的形状

    java - 更新 jar 中的文件会抛出 ZipException

    java.lang.IllegalStateException : Component javax. faces.component.UIViewRoot@19ded20 不是预期的类型

    java - 在 Java 中解析 JSON 字符串

    java - 尝试将 JBPM 与 MAVEN 集成时 java.lang.NoSuchFieldError : DESCR