自学内容网 自学内容网

工作流引擎Camunda、Flowable和Activiti查询流程变量

流程变量作用:任务节点中传递数据、存储结果数据【设置RestAPI接口与前端通讯】等

 

在工作流引擎中,查询流程变量是一个常见的需求,因为流程变量是流程实例在执行过程中需要保存和使用的数据。以下是在Flowable中查询流程变量的几种方法:

一、查询流程变量的一般方法

  1. 通过RuntimeService查询
    • 在流程实例运行时,可以使用RuntimeService来查询与流程实例或执行实例相关的流程变量。例如,可以通过执行实例ID(executionId)来查询变量:
Map<String, Object> variables = runtimeService.getVariables(executionId);

或者查询特定名称的变量:

Object variableValue = runtimeService.getVariable(executionId, variableName);

通过TaskService查询

  • 当查询与任务(Task)相关的局部变量时,可以使用TaskService。这些变量是与特定任务实例绑定的,只在任务持续期间有效:
Map<String, Object> taskVariables = taskService.getVariables(taskId);

 或查询特定名称的任务局部变量:

Object taskVariableValue = taskService.getVariable(taskId, variableName);

通过HistoryService查询历史变量

在流程实例结束后,流程变量的运行时数据会被删除,但历史数据会保留在act_hi_varinst表中。因此,对于已完成的流程实例,需要通过HistoryService来查询历史变量:

List<HistoricVariableInstance> historicVariables = historyService.createHistoricVariableInstanceQuery()  
    .processInstanceId(processInstanceId)  
    .orderByVariableName.desc()  
    .list();

二、查询流程变量的注意事项

  1. 作用域
    • 流程变量可以设置为全局作用域(流程实例级别)或局部作用域(任务或执行实例级别)。全局变量在整个流程实例中有效,而局部变量只在指定的任务或执行实例中有效。
  2. 变量类型
    • Flowable支持多种类型的流程变量,包括基本数据类型(如String、Integer)和复杂数据类型(如自定义对象)。在查询时,需要确保正确地处理这些类型。
  3. 性能考虑
    • 在处理大量流程实例和变量时,查询性能可能成为一个问题。因此,建议在设计流程时考虑如何有效地使用和管理流程变量,以减少查询的复杂性和提高性能。

三、总结

Flowable提供了灵活的API来查询流程变量,包括在流程实例运行时、任务执行时以及流程实例结束后查询历史变量。在查询流程变量时,需要注意变量的作用域、类型和性能问题。通过合理使用这些API,可以有效地管理和查询流程变量,以满足业务流程的需求。

四、应用

camunda工作流引擎如何调用现有的python编写的服务,并调用将结果返回前端

在Camunda工作流引擎中调用Python编写的服务并将结果返回前端,通常涉及几个步骤:集成外部服务、调用这些服务、处理响应,以及将结果传递给前端。由于Camunda是基于Java的,直接调用Python服务需要一些间接方法,如使用HTTP REST API、消息队列或远程过程调用(RPC)框架。

下面是一个基于HTTP REST API的示例步骤,假设你的Python服务已经部署并可以通过HTTP接口接收和返回数据。

步骤 1: 创建Python服务

首先,确保你的Python服务可以通过HTTP接口接收请求并返回响应。你可以使用Flask或Django等框架来实现。

示例(使用Flask):

from flask import Flask, request, jsonify  
  
app = Flask(__name__)  
  
@app.route('/service', methods=['POST'])  
def service():  
    data = request.json  
    # 处理数据  
    result = {"processed_data": "Processed " + data.get("input_data", "no data")}  
    return jsonify(result)  
  
if __name__ == '__main__':  
    app.run(debug=True, port=5000)
步骤 2: 在Camunda中调用Python服务

在Camunda中,你可以使用外部任务(External Task)、Service Task调用HTTP客户端(如使用Camunda REST API客户端、Java的HttpClient等)或Script Task(不推荐用于生产环境,因为脚本语言在Camunda中性能较差且难以维护)。

使用Service Task和HTTP客户端(如Apache HttpClient):

  1. 创建一个新的Camunda流程,并在其中添加一个Service Task。
  2. 编写Java Delegate,在这个Delegate中,使用HttpClient来调用你的Python服务。
import org.apache.http.client.methods.HttpPost;  
import org.apache.http.entity.StringEntity;  
import org.apache.http.impl.client.CloseableHttpClient;  
import org.apache.http.impl.client.HttpClients;  
import org.apache.http.util.EntityUtils;  
import org.camunda.bpm.engine.delegate.DelegateExecution;  
import org.camunda.bpm.engine.delegate.JavaDelegate;  
  
public class CallPythonServiceDelegate implements JavaDelegate {  
    @Override  
    public void execute(DelegateExecution execution) throws Exception {  
        CloseableHttpClient httpClient = HttpClients.createDefault();  
        HttpPost request = new HttpPost("http://localhost:5000/service");  
        String jsonInputString = "{\"input_data\": \"Hello Python\"}";  
          
        StringEntity input = new StringEntity(jsonInputString);  
        input.setContentType("application/json");  
        request.setEntity(input);  
  
        String jsonResponse = httpClient.execute(request, httpResponse ->   
            EntityUtils.toString(httpResponse.getEntity()));  
  
        // 处理响应并设置到流程变量  
        execution.setVariable("result", jsonResponse);  
  
        httpClient.close();  
    }  
}
步骤 3: 将结果传递给前端

当流程执行完毕后,你可以通过Camunda REST API查询流程实例变量来获取结果,并在前端显示这些结果。(查询历史任务实例的指定变量)

前端示例(使用JavaScript和Fetch API):

fetch('http://your-camunda-server/engine-rest/process-instance/your-process-instance-id/variables', {  
    method: 'GET',  
    headers: {  
        'Content-Type': 'application/json',  
        'Authorization': 'Basic ' + btoa('username:password') // 根据需要调整  
    }  
})  
.then(response => response.json())  
.then(data => {  
    console.log(data); // 处理数据并显示在前端  
});

确保替换your-camunda-serveryour-process-instance-idusernamepassword等占位符为实际的值。

这就是在Camunda工作流引擎中调用Python服务并将结果返回给前端的基本步骤。根据实际需要,可能还需要考虑安全性、错误处理、性能优化等方面的问题。


原文地址:https://blog.csdn.net/m0_55049655/article/details/140534908

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!