Activiti BPMN:如何传递完成任务的用户名至Shell任务参数
如何在Activiti中将任务办理人传递给Shell任务并存入数据库
嘿,作为Activiti新手,你这个需求其实挺常见的,我来给你一步步拆解怎么实现~
1. 先把任务办理人存成流程变量
当用户完成User Task时,Activiti会自动记录这个任务的办理人(也就是assignee)。我们需要把这个值存到流程变量里,方便后续Shell任务调用。
最简单的方式是给User Task加一个任务完成监听器:
- 在BPMN编辑器里选中你的User Task,找到「任务监听器」配置项
- 添加一个监听器,事件类型选
complete(任务完成时触发) - 选择「表达式」类型,输入以下表达式:
这样就把完成任务的用户名存到名为execution.setVariable("completedUsername", task.assignee)completedUsername的流程变量里了。
2. 给Shell任务配置参数
接下来到你的Shell Task配置页面,在「命令」输入框里,把流程变量作为参数传给你的脚本。比如你的脚本叫save-user-to-db.sh,那命令可以写成:
./save-user-to-db.sh ${completedUsername}
Activiti在执行Shell任务时,会自动把${completedUsername}替换成实际的用户名。
3. 编写Shell脚本处理参数并存库
最后写你的Shell脚本,接收传入的用户名参数,然后插入到数据库里。这里举个MySQL的例子:
#!/bin/bash # 第一个参数就是传递过来的用户名 TARGET_USER=$1 # 替换成你的数据库信息 DB_USER="your_db_username" DB_PASS="your_db_password" DB_NAME="your_database_name" TABLE_NAME="your_target_table" # 执行插入操作(注意:生产环境要避免SQL注入,建议用参数化方式) mysql -u ${DB_USER} -p${DB_PASS} -D ${DB_NAME} -e "INSERT INTO ${TABLE_NAME} (username) VALUES ('${TARGET_USER}');"
⚠️ 重要提醒:直接把参数拼进SQL有SQL注入风险,生产环境可以考虑用mysql的--execute配合预处理语句,或者用其他工具(比如psql对于PostgreSQL)来安全传递参数。
小测试技巧
你可以先启动一个测试流程,完成User Task后,用Activiti的API或者控制台查看completedUsername这个变量是否正确设置,再触发Shell任务验证参数是否传递成功,这样能快速定位问题~
内容的提问来源于stack exchange,提问作者Ravindra Rane
相关产品推荐
相关产品推荐

