activiti学习(十五)——表达式的使用

activiti学习(十五)——表达式的使用

2023年8月1日发(作者:)

activiti学习(⼗五)——表达式的使⽤本⽂开始重新回归⼀些activiti的基本使⽤。感觉前⾯太想展开源码和架构⽅⾯的探讨,但在这过程中,⼜涉及到activiti很多基本的⽤法我没有熟练使⽤,例如表达式、⽹关、多实例任务、作业、边界事件等等。导致在探讨源码的时候常常⼀笔带过,虽然对整体理解没有太⼤的问题,但是总感觉缺了点什么。所以后续决定也要熟练这些基本功能的使⽤。毕竟很多业务场景还是需要使⽤这些功能的。表达式简述activiti使⽤UEL处理表达式。UEL(Unified Expression Language)是EE6规范的⼀部分。activiti使⽤JUEL以⽀撑所有的运⾏环境及最新的UEL规范。表达式可以⽤在很多场景中,例如ServiceTask、执⾏监听器、任务监听器以及连线的条件上。表达式${param}${}${()}${("hello")}表达式含义获取变量param的值获取对象param的age属性的值调⽤对象param的test⽅法调⽤对象param的test⽅法,参数为字符串"hello"除了上⾯所说的这些表达式,还有以下三种流程引擎的内置变量变量名称taskexecutionauthenticatedUserId变量含义通过此变量可以获取⽤户任务相关的属性。实现了DelegateTask接⼝通过此变量可以获取流程实例的信息。实现了DelegateExecution接⼝在启动流程时调⽤IdentityService的setAuthenticatedUserId⽅法设置表达式举例现在有个场景,新建⼀个请假流程,员⼯提交给经理审批,流程到员⼯待办和到经理待办时都有提⽰,流程结束时也会提⽰流程完成。这个例⼦我们使⽤系列⽂章最简单的作为流程引擎配置⽂件,在《》中查找。流程⽂档如下:

public void callComplete(DelegateExecution execution) { n(cessBusinessKey() + " 流程完成"); }}Notice类的实例因为要作为流程变量传⼊,所以必须实现Serializable接⼝。我们定义callEmployee和callComplete⽅法,分别表⽰通知员⼯有新待办和通知流程结束。注意这两个⽅法的参数,它们是通过内置变量task和execution传⼊,可往回查看流程⽂档对应的地⽅。接下来创建⼀个ManagerListener,作为usertask2的任务监听器。这个类作为delegateExpression⽅法创建任务监听器的处理类,和class⽅式创建的任务监听器差不多,区别是class⽅式需指定具体类,⽽delegateExpression⽅式则是通过流程变量指定:public class ManagerListener implements TaskListener{ public void notify(DelegateTask delegateTask) { String assignee = ignee(); n(assignee + "经理有待办需要审批"); }}这⾥notify实现很简单,就是简单输出某某精⼒有待办的提⽰。下⾯是我们的客户调⽤,blic class App {

private ProcessEngine pe; public void getFromProcessEngineConfiguration() { ProcessEngineConfiguration pec = ProcessEngineConfiguration .createProcessEngineConfigurationFromResource(""); pe = rocessEngine(); }

public void deploy() { RepositoryService repositoryService = ositoryService(); DeploymentBuilder deploymentBuilder = Deployment();

InputStream inputStream = null; try { inputStream = ssLoader().getResource("bpmn/").openStream(); utStream("", inputStream); ("expressDeployment"); Deployment deployment = (); n("部署完成"); } catch (IOException e) { tackTrace(); } } public static void main(String[] args) { App app = new App(); mProcessEngineConfiguration(); (); }}5-9⾏为初始化流程引擎。11-25⾏为部署流程⽂档。这个和以前没什么区别,部署流程⽂档之后,查看数据库的情况,查看act_re_procdef:接下来我们添加启动函数并调⽤之:public void startProcessByIdWithVars() { RuntimeService runtimeService = timeService(); Notice notice = new Notice(); String businessKey = "请假单01"; Map vars = new HashMap(); ("employee", "张三"); ("notice", notice); ProcessInstance pi = rocessInstanceById("expressProcess:1:4", businessKey, vars); n("流程开始");}第7-8⾏把notice作为流程变量,并在启动流程时添加进去。此时控制台输出: 可以看到流程已经成功调⽤Notice的callEmployee⽅法,使⽤expression创建监听器成功。此时act_re_task表: 接着定义⼀个employeeCompleteTask,员⼯环节提交的⽅法并调⽤之:public void employeeCompleteTask() { TaskService taskService = kService(); TaskListener taskListener = new ManagerListener(); Map vars = new HashMap(); ("callManager", taskListener); ("manager", "李四"); te("2508", vars); n("完成提交");}第5⾏设置ManagerListener到callManager变量中,第6⾏把“李四”设置到“manager”变量中。执⾏后看看控制台输出:可以看到已经成功触发了任务监听器ManagerListener,通过delegateExpression创建监听器成功。再看此时act_re_task表:

接下来定义经理审批⽅法manageCompleteTask并调⽤之:public void manageCompleteTask() { TaskService taskService = kService(); TaskListener taskListener = new ManagerListener(); Map vars = new HashMap(); te("5006", vars); n("完成提交");}执⾏该⽅法,正常来说流程结束。此时看看控制台:可以看到已经成功触发Notice的callComplete⽅法。到⽬前为⽌我们已经掌握表达式的基本⽤法,并把它使⽤在任务监听器、执⾏监听器以及设置assignee。在ServiceTask、连线条件上的使⽤⼤同⼩异,请读者⾃⾏学习,后⾯的⽂章中也会进⾏使⽤。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690874741a452343.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信