工作流引擎Camunda、Flowable和Activiti查询流程变量
流程变量作用:任务节点中传递数据、存储结果数据【设置RestAPI接口与前端通讯】等
在工作流引擎中,查询流程变量是一个常见的需求,因为流程变量是流程实例在执行过程中需要保存和使用的数据。以下是在Flowable中查询流程变量的几种方法:
一、查询流程变量的一般方法
- 通过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();
二、查询流程变量的注意事项
- 作用域
- 流程变量可以设置为全局作用域(流程实例级别)或局部作用域(任务或执行实例级别)。全局变量在整个流程实例中有效,而局部变量只在指定的任务或执行实例中有效。
- 变量类型
- Flowable支持多种类型的流程变量,包括基本数据类型(如String、Integer)和复杂数据类型(如自定义对象)。在查询时,需要确保正确地处理这些类型。
- 性能考虑
- 在处理大量流程实例和变量时,查询性能可能成为一个问题。因此,建议在设计流程时考虑如何有效地使用和管理流程变量,以减少查询的复杂性和提高性能。
三、总结
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):
- 创建一个新的Camunda流程,并在其中添加一个Service Task。
- 编写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-server
、your-process-instance-id
、username
和password
等占位符为实际的值。
这就是在Camunda工作流引擎中调用Python服务并将结果返回给前端的基本步骤。根据实际需要,可能还需要考虑安全性、错误处理、性能优化等方面的问题。
原文地址:https://blog.csdn.net/m0_55049655/article/details/140534908
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!