工作流activiti 6 学习笔记十一 流程与任务监听器

举报
lu_zhishen 发表于 2021/09/28 15:24:50 2021/09/28
【摘要】 任务监听器分为在创建任务节点时监听,创建委托人时监听,审批完成后监听三种。以下代码展示了一个任务节点同时有三种监听,是如何触发的,同时在创建任务节点监听时使用了注入,在监听类里面拿到注入的属性值。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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。