工作流activiti 6 学习笔记十一 流程与任务监听器
【摘要】 任务监听器分为在创建任务节点时监听,创建委托人时监听,审批完成后监听三种。以下代码展示了一个任务节点同时有三种监听,是如何触发的,同时在创建任务节点监听时使用了注入,在监听类里面拿到注入的属性值。bpmn代码如下: <process id="myProcess" name="My process" isExecutable="true"> <startEvent id="startev...
任务监听器
分为在创建任务节点时监听,创建委托人时监听,审批完成后监听三种。以下代码展示了一个任务节点同时有三种监听,是如何触发的,同时在创建任务节点监听时使用了注入,在监听类里面拿到注入的属性值。
bpmn代码如下:
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="usertask1" name="task1" activiti:assignee="scf">
<extensionElements>
<activiti:taskListener event="create" class="org.scf.act.api.task.listener.TaskListenerCreate">
<activiti:field name="myName" stringValue="ddddd">
<activiti:string>scf</activiti:string>
</activiti:field>
</activiti:taskListener>
<activiti:taskListener event="complete" class="org.scf.act.api.task.listener.TaskListenerComplete"></activiti:taskListener>
<activiti:taskListener event="assignment" class="org.scf.act.api.task.listener.TaskListenerAssign"></activiti:taskListener>
</extensionElements>
</userTask>
<userTask id="usertask2" name="task2"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
</process>
三个监听类的代码
public class TaskListenerAssign implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("委托触发");
}
}
public class TaskListenerComplete implements TaskListener{
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("审批完成触发");
}
}
public class TaskListenerCreate implements TaskListener {
private FixedValue myName;
private FixedValue ddddd;
public FixedValue getDdddd() {
return ddddd;
}
public void setDdddd(FixedValue ddddd) {
this.ddddd = ddddd;
}
public void setMyName(FixedValue myName) {
this.myName = myName;
}
public FixedValue getMyName() {
return myName;
}
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("创建任务节点触发---"+myName.getExpressionText()+"----"+ddddd);
}
}
测试类:
// 部署流程
Deployment deploye = rs.createDeployment().addClasspathResource("task_listener.bpmn").deploy();
ProcessDefinition pdf = rs.createProcessDefinitionQuery().deploymentId(deploye.getId()).singleResult();
ProcessInstance pi = runS.startProcessInstanceById(pdf.getId());
System.out.println(pi.getId());
Task task = ts.createTaskQuery().processInstanceId(pi.getId()).singleResult();
ts.complete(task.getId());
运行结果
委托触发
创建任务节点触发---ddddd----null
325005
审批完成触发
从运行结果分析,是先触发委托,再触发创建任务节点,最后触发的审批完成。需要注意的是bpmn文件中使用stringValue 属性无法注入,需要使用子节点<activiti:string>
<activiti:field name="myName" stringValue="ddddd"> 标红的部分无法注入。
<activiti:string>scf</activiti:string>
</activiti:field>
流程监听器
触发流程监听事件有以下几种:开始事件,结束事件,流程之间的过渡,流程活动的开始和结束,流程网关的开始,中间事件的开始和结束,开始事件的结束和结束事件的开始。只需要将扩展节点放到对应的位置即可。下面示例演示 开始节点,结束节点,第一个流转的监听事件。
bpmn文件
<process id="myProcess" name="My process" isExecutable="true">
<extensionElements>
<activiti:executionListener event="end" class="org.scf.act.api.event.listener.EndListener">
<activiti:field name="message">
<activiti:string>流程结束</activiti:string>
</activiti:field>
</activiti:executionListener>
<activiti:executionListener event="start" class="org.scf.act.api.event.listener.StartListener">
<activiti:field name="message">
<activiti:string>流程开始</activiti:string>
</activiti:field>
</activiti:executionListener>
</extensionElements>
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="usertask1" name="User Task"></userTask>
<userTask id="usertask2" name="User Task"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1">
<extensionElements>
<activiti:executionListener class="org.scf.act.api.event.listener.FlowListener">
<activiti:field name="message">
<activiti:string>开始到task1</activiti:string>
</activiti:field>
</activiti:executionListener>
</extensionElements>
</sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
</process>
三个监听类,只需要换对应的类明即可,此处只粘贴开始监听器。
public class StartListener implements ExecutionListener{
private FixedValue message;
public FixedValue getMessage() {
return message;
}
public void setMessage(FixedValue message) {
this.message = message;
}
@Override
public void notify(DelegateExecution execution) {
System.out.println(message.getExpressionText());
}
}
测试类:
// 部署流程
Deployment deploye = rs.createDeployment().addClasspathResource("event_listener.bpmn").deploy();
ProcessDefinition pdf = rs.createProcessDefinitionQuery().deploymentId(deploye.getId()).singleResult();
ProcessInstance pi = runS.startProcessInstanceById(pdf.getId());
System.out.println(pi.getId());
Task task = ts.createTaskQuery().processInstanceId(pi.getId()).singleResult();
ts.complete(task.getId());
task = ts.createTaskQuery().processInstanceId(pi.getId()).singleResult();
ts.complete(task.getId());
运行结果:
流程开始
开始到task1
332505
流程结束
代码解释:
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)