我的微服务有一个 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 来实现此功能:
- 创建一个硬编码的 DMN 表,其中输入 = carId,输出 = locationId。
- 创建一个 BPMN 图,其中包含
- 开始 ->
- 从传递给 Rest Web 服务的 Car DTO 中提取 carId (getLocationForCar()) ->
- 调用 DMN 将 carId 提供给它 ->
- 将 DMN 的输出发送到 java 进程,以便可以将其作为 Web 服务 (getLocationForCar()) 响应发送
这种方法有问题(我需要帮助来回答以下问题):
- 如何从 java Rest Webservice 代码调用 BPMN 流程?
- 如何将 Car 对象传递给 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();
- 使用 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/