Java调用的BPMN进程

Java调用的BPMN进程,java,jbpm,bpmn,camunda,Java,Jbpm,Bpmn,Camunda,我的微服务有一个Rest端点(getLocationForCar()),它接受一个汽车DTO(如下所示)作为输入,有一些业务逻辑在某个位置查找汽车并返回位置DTO(如下所示) 我想将业务逻辑转移到BPMN和DMN。我是BPMN和DMN的新手。 我阅读了卡蒙达的一些教程,并认为这就是我如何与卡蒙达合作的方法: 创建一个硬编码的DMN表,输入=carId,输出=locationId 创建一个具有 开始-> 从传递给Rest Web服务(getLocationForCar())的Car DTO中提取

我的微服务有一个Rest端点(getLocationForCar()),它接受一个汽车DTO(如下所示)作为输入,有一些业务逻辑在某个位置查找汽车并返回位置DTO(如下所示)

我想将业务逻辑转移到BPMN和DMN。我是BPMN和DMN的新手。 我阅读了卡蒙达的一些教程,并认为这就是我如何与卡蒙达合作的方法:

  • 创建一个硬编码的DMN表,输入=carId,输出=locationId
  • 创建一个具有
    • 开始->
    • 从传递给Rest Web服务(getLocationForCar())的Car DTO中提取carId->
    • 致电DMN向其提供carId->
    • 将DMN的输出发送到java进程,以便将其作为webservice(getLocationForCar())响应发送
  • 此方法存在问题(我需要帮助回答以下问题):

  • 如何从JavaRESTWebService代码调用BPMN进程
  • 如何将Car对象传递给BPMN,以便它能够提取carId,在DMN表中使用它并获得输出
  • java代码将如何从BPMN进程或DMN表中获得输出,这些输出可用于返回所需的响应对象
  • 使用Camunda(第三方库)似乎是一种开销,因为Camunda运行在它自己的服务器上,并且bpmn、dmn部署在该服务器上,这会减慢我的进程。
    因此,我更倾向于JBPM(尽管我不知道是否可以使用其中任何一种来实现我的需求)。

    DMN是提取业务逻辑的好方法。Imho Camunda是最好的lightweigt和免费产品

    这里给你举个例子

  • 只需使用这两个依赖项:
  • org.camunda.bpm.dmn:camunda引擎dmn
    org.camunda.bpm.dmn:camunda引擎dmn bom

  • 创建DmnEngine:
  • DmnEngine DmnEngine=DmnEngine配置
    .createDefaultDmnEngineConfiguration()
    .buildEngine();
    
  • 使用Camunda Modeler创建DMN文件(免费)
  • 为决策评估准备变量:
  • VariableMap variables=变量
    .putValue(“carId”,carId)
    .putValue(“卡纳姆”,卡纳姆);
    .putValue(“carType”,carType);
    .putValue(“carModel”,carModel);
    .putValue(“卡马克”,卡马克);
    
  • 解析步骤3中的决策(从Camunda Modeler复制XML代码并粘贴到项目中的新XML文件中)
  • 评估决策
  • 如果您想使用更复杂的DMN图,可以使用决策需求图(请参阅:)。使用Camunda,您可以有多个输出值,就像您在示例中需要的那样。 此外,您可以使用Camunda的扩展名,比如Feel Scala,这样您就可以在DMN文件中使用函数。此外,您还可以为DMN编写自己的自定义函数。
    使用这种方法,您不需要使用Camunda平台。只需使用2个依赖项,您就可以将逻辑移动到这些DMN文件。使用Camunda Modeler,您可以上载dmn文件:例如,您可以创建一个接收这些文件并将其保存在数据库中的微服务。您的DMNEEngine micro服务将加载该文件并评估决策。

    Camunda可以嵌入您现有的java web应用程序中运行,或者如您所述,在将从web应用程序调用的sperate服务器上运行。(卡蒙达居住的地方是它自己的建筑决定。)卡蒙达文档非常优秀,周围有很多例子。请用一些代码更新您的问题,这些代码显示了您尝试过但不起作用的内容。另一个问题-是否可以使用OSGi、docker将jBPM或Camunda(免费版本)无缝嵌入到微服务中?docker肯定是(有示例),但是我对OSGi不熟悉。你能分享一个有助于我学习的例子的链接吗?我这里有一个后续问题()。如果可能的话,请回复。
    class Car {
       String carId;
       String carName;
       String carType;
       String carModel;
       String carMake;
    }
    class Location {
       String locationId;
       String locationType;
       String locationAddress;
    }
    
     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());
          }
        }
      }