Activiti5第十一弹,流程监听器与任务监听器

首先创建流程监听器和任务监听器的实体类,个人比较喜欢使用Delegate Expression方式,其他两种方式也可以


流程监听器

package org.mpc.final_activiti;import java.io.Serializable;import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.delegate.Expression;/*** * 可以使用 CLASS ,EXPRESSION,DELEGATE EXPRESSSION三种方式来创建监听器,这里使用第三种方式,其他两种方式和* 在servicetask中的使用方式相同* * */
public class ExectuionListenerDemo implements Serializable, ExecutionListener {/*** @Fields serialVersionUID : TODO(用一句话描述这个变量表示什么)*/private static final long serialVersionUID = 8513750196548027535L;private Expression message;public Expression getMessage() {return message;}public void setMessage(Expression message) {this.message = message;}@Overridepublic void notify(DelegateExecution execution) throws Exception {System.out.println("流程监听器" + message.getValue(execution));}}

任务监听器

package org.mpc.final_activiti;import java.io.Serializable;import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.delegate.TaskListener;/*** * 任务监听器,实现TaskListener接口* * */
public class TaskListenerDemo implements Serializable, TaskListener {private Expression arg;public Expression getArg() {return arg;}public void setArg(Expression arg) {this.arg = arg;}@Overridepublic void notify(DelegateTask delegateTask) {System.out.println("任务监听器:" + arg.getValue(delegateTask));}}

这两个监听器只是简单的表明了自己的身份,并打印出在流程中注入给他们的值


接着是流程定义图




从左到右依次是  空开始事件--排他网关--用户任务--空中间抛出事件--空结束事件

首先在空白处点击鼠标,接着在properties选项卡中做如下操作:



然后在排他网关、空中间抛出事件、以及节点之间的箭头上点击鼠标同样可以做如上的操作,这些都流程监听事件的配置



在usertask上我们特别配置usertask才有的任务监听器,配置过程如下图所示



和流程监听器的配置大同小异呢


展示一下配置结果的xml文件,特别注意一下加注释的地方

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"><process id="myProcess" name="My process" isExecutable="true"><extensionElements><activiti:executionListener event="start" delegateExpression="${myprocessListener}"><activiti:field name="message"><activiti:string><![CDATA[流程启动]]></activiti:string></activiti:field></activiti:executionListener><activiti:executionListener event="end" delegateExpression="${myprocessListener}"><activiti:field name="message"><activiti:string><![CDATA[流程结束]]></activiti:string></activiti:field></activiti:executionListener></extensionElements><startEvent id="startevent1" name="Start"></startEvent><exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"><extensionElements><activiti:executionListener event="start" delegateExpression="${myprocessListener}"><activiti:field name="message"><activiti:string><![CDATA[排他网关开始]]></activiti:string></activiti:field></activiti:executionListener><activiti:executionListener event="end" delegateExpression="${myprocessListener}"><activiti:field name="message"><activiti:string><![CDATA[排他网关结束]]></activiti:string></activiti:field></activiti:executionListener></extensionElements></exclusiveGateway><sequenceFlow id="flow3" sourceRef="startevent1" targetRef="exclusivegateway1"></sequenceFlow><userTask id="usertask2" name="User Task" activiti:assignee="${user}"><extensionElements><activiti:taskListener event="create" delegateExpression="${mytaskListener}"><activiti:field name="arg"><activiti:string><![CDATA[任务启动]]></activiti:string></activiti:field></activiti:taskListener><activiti:taskListener event="assignment" delegateExpression="${mytaskListener}"><activiti:field name="arg"><activiti:string><![CDATA[分配人员]]></activiti:string></activiti:field></activiti:taskListener><activiti:taskListener event="complete" delegateExpression="${mytaskListener}"><activiti:field name="arg"><activiti:string><![CDATA[任务完成]]></activiti:string></activiti:field></activiti:taskListener><!-- 在可视化工具中无法给usertask加上流程监听器,但是,我们在xml中可以自己敲进去· --><activiti:executionListener event="start" delegateExpression="${myprocessListener}"><activiti:field name="message"><activiti:string><![CDATA[流程启动任务]]></activiti:string></activiti:field></activiti:executionListener><activiti:executionListener event="end" delegateExpression="${myprocessListener}"><activiti:field name="message"><activiti:string><![CDATA[流程关闭任务]]></activiti:string></activiti:field></activiti:executionListener><!-- ........................................................................................................................................ --></extensionElements></userTask><sequenceFlow id="flow4" sourceRef="exclusivegateway1" targetRef="usertask2"><extensionElements><activiti:executionListener event="take" delegateExpression="${myprocessListener}"><activiti:field name="message"><activiti:string><![CDATA[从排他网关到用户任务,好长的一段路]]></activiti:string></activiti:field></activiti:executionListener></extensionElements></sequenceFlow><intermediateThrowEvent id="noneintermediatethrowevent1" name="NoneThrowEvent"><extensionElements><activiti:executionListener event="start" delegateExpression="${myprocessListener}"><activiti:field name="message"><activiti:string><![CDATA[中间事件开始]]></activiti:string></activiti:field></activiti:executionListener><activiti:executionListener event="end" delegateExpression="${myprocessListener}"><activiti:field name="message"><activiti:string><![CDATA[中间事件结束]]></activiti:string></activiti:field></activiti:executionListener></extensionElements></intermediateThrowEvent><sequenceFlow id="flow5" sourceRef="usertask2" targetRef="noneintermediatethrowevent1"></sequenceFlow><endEvent id="endevent1" name="End"></endEvent><sequenceFlow id="flow6" sourceRef="noneintermediatethrowevent1" targetRef="endevent1"></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_myProcess"><bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess"><bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"><omgdc:Bounds height="35.0" width="35.0" x="160.0" y="180.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1"><omgdc:Bounds height="40.0" width="40.0" x="240.0" y="130.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2"><omgdc:Bounds height="55.0" width="105.0" x="325.0" y="123.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="noneintermediatethrowevent1" id="BPMNShape_noneintermediatethrowevent1"><omgdc:Bounds height="35.0" width="35.0" x="475.0" y="133.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"><omgdc:Bounds height="35.0" width="35.0" x="555.0" y="133.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"><omgdi:waypoint x="195.0" y="197.0"></omgdi:waypoint><omgdi:waypoint x="260.0" y="170.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"><omgdi:waypoint x="280.0" y="150.0"></omgdi:waypoint><omgdi:waypoint x="325.0" y="150.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5"><omgdi:waypoint x="430.0" y="150.0"></omgdi:waypoint><omgdi:waypoint x="475.0" y="150.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6"><omgdi:waypoint x="510.0" y="150.0"></omgdi:waypoint><omgdi:waypoint x="555.0" y="150.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>


为了让usertak产生一个指定人员的事件,我们给这个usertask弄一个指定人员



然后就是测试代码

package final_activiti.progress;import java.util.HashMap;
import java.util.Map;import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.test.Deployment;
import org.junit.Test;
import org.mpc.final_activiti.ExectuionListenerDemo;
import org.mpc.final_activiti.TaskListenerDemo;public class ListenersTest extends PluggableActivitiTestCase {@Test@Deployment(resources = "final_activiti/progress/listeners.bpmn")public void test() {Map<String, Object> map = new HashMap<String, Object>();map.put("myprocessListener", new ExectuionListenerDemo());map.put("mytaskListener", new TaskListenerDemo());map.put("user", "mpc");runtimeService.startProcessInstanceByKey("myProcess", map);taskService.complete(taskService.createTaskQuery().singleResult().getId());;}}

测试结果:


分析:

1.我们给usertask定义的流程监听实现了

2.usertask中先执行流程监听的start、然后是分配人员、任务启动、任务完成、流程关闭任务;任务是包含在流程中的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASCII码对照表

1、字母转换成ASCII码 1 string str "hello";2 byte[] array new byte[1]; 3 array System.Text.Encoding.ASCII.GetBytes(str); //把str的每个字符转换成ascii码4 5 int asciicode1 (short)(array[0]);//h 的…

平行四边形的特殊性质

定义平行四边形内角平分线围城的四边形为$\lambda$四边形$\lambda$四边形是矩形 $\lambda$四边形的中线为平行四边形中心$\lambda$四边形的对角线和平行四边形的边平行转载于:https://www.cnblogs.com/guoshaoyang/p/11011612.html

对象的深度复制

首先什么是深度复制&#xff1f;什么又是浅复制&#xff1f; 百度告诉我---------------> 浅复制&#xff1a;将一个对象复制后&#xff0c;基本类型都会重新创建&#xff0c;而引用类型指向的还是原对象所指的引用&#xff1b; 深复制&#xff1a;讲一个对象复制后&…

如何在idea中使用Mybatis-generator插件快速生成代码

代码下载地址&#xff1a;https://download.csdn.net/download/hua_faded/10671547 一、配置Maven pom.xml 文件 在pom.xml增加以下插件&#xff1a; <build><finalName>zsxt</finalName> <plugins> <plugin> <groupId>org.mybatis.genera…

django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

CBV加装饰器 第一种  method_decorator(装饰器&#xff09;  加在get上 第二种  method_decorator(login_auth,nameget)  加在类上 第三种  method_decorator(login_auth)  加在dispatch上  3.7的要return super().dispatch def login(request):if request.metho…

Dubbo理论知识

本文是作者根据官方文档以及自己平时的使用情况&#xff0c;对 Dubbo 所做的一个总结。如果不懂 Dubbo 的使用的话&#xff0c;可以参考我的这篇文章《超详细&#xff0c;新手都能看懂 &#xff01;使用SpringBootDubbo 搭建一个简单的分布式服务》 Dubbo 官网&#xff1a;http…

外观模式(facade)

外观模式是为了解决类与类之间的依赖关系的&#xff0c;像spring一样&#xff0c;可以将类和类之间的关系配置到配置文件中&#xff0c;而外观模式就是将他们的关系放在一个Facade类中&#xff0c;降低了类类之间的耦合度&#xff0c;该模式中没有涉及到接口&#xff0c;看下类…

widows下nignx的使用

nignx在Linux环境下可以大展身手&#xff0c;在widows环境下也可以启动一定的效果&#xff0c;但是没有linux用的好。 Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。 什么是反向代理&#xff1f; 反向代…

享元模式(Flyweight)

享元模式的主要目的是实现对象的共享&#xff0c;即共享池&#xff0c;当系统中对象多的时候可以减少内存的开销&#xff0c;通常与工厂模式一起使用。 FlyWeightFactory负责创建和管理享元单元&#xff0c;当一个客户端请求时&#xff0c;工厂需要检查当前对象池中是否有符合条…

redo

在innodb存储引擎中&#xff0c;事务日志通过重做(redo)日志文件和InnoDB存储引擎的日志缓冲(InnoDB Log Buffer)来实现。当开始一个事务时&#xff0c;会记录该事务的一个LSN(Log Sequence Number&#xff0c;日志序列号)&#xff1b;当事务执行时&#xff0c;会往InnoDB存储引…

迭代子模式(Iterator)

顾名思义&#xff0c;迭代器模式就是顺序访问聚集中的对象&#xff0c;一般来说&#xff0c;集合中非常常见&#xff0c;如果对集合类比较熟悉的话&#xff0c;理解本模式会十分轻松。这句话包含两层意思&#xff1a;一是需要遍历的对象&#xff0c;即聚集对象&#xff0c;二是…

oracle查看执行计划入门

基于Oracle的应用系统很多的性能问题都是由应用系统的SQL性能低劣引起的&#xff0c;因此SQL的性能优化非常重要。要分析与优化SQL的性能&#xff0c;一般是通过查看该SQL的执行计划&#xff0c;然后通过执行计划有针对性地对SQL进行相应的优化。 什么是执行计划&#xff08;Ex…

这半年……

有半日也还清闲的时间&#xff0c;一年的一半也快过完了&#xff0c;那就来谈一谈这半年吧&#xff0c;也对下半年提出点期待。 年初&#xff0c;提出了本年度的的关键词&#xff1a;真实、踏实、勤快。 基于这个指导思想&#xff0c;我对自己半年的评价是&#xff1a;做得不错…

layui如何隐藏弹出层关闭的按钮

layui默认弹出层是带有关闭按钮的&#xff0c;但是在某些场景我们不需要layui的关闭按钮&#xff0c;这时只需添加closeBtn :0即可效果图如下: 示例代码如下: layui.use(layer, function () {var layer layui.layer;layer.open({skin: demo-class,type: 1,title: 登录,area: […

charles请求入参中有乱码

工作中&#xff0c;需要入参&#xff0c;但是发现入参中&#xff0c;有中文的都是乱码&#xff0c;仔细查阅headers&#xff0c;发现Content-Type是application/x-www-form-urlencoded类型&#xff0c;而实际上&#xff0c;入参是json类型&#xff0c;因此需要强制修改请求头为…

用spring搭建微信公众号开发者模式下服务器处理用户消息的加密传输构架(java)

要搭建加密传输的微信公众号消息传输&#xff0c;首先要在开发这平台下载一下微信加密的相关jar包&#xff0c;并做一些准备。准备的步骤如下&#xff1a; 1.打开开发者文档&#xff0c;找到消息加减密--->接入指引&#xff0c;如下图所示&#xff1a; 2.在页面底部找到实例…

Spring中AOP的使用

问题&#xff1a;什么是AOP&#xff1f; 答&#xff1a;AOP基本概念&#xff1a;Aspect-Oriented Programming&#xff0c;面向方面编程的简称&#xff0c;Aspect是一种新的模块化机制&#xff0c;用来描述分散在对象、类或方法中的横切关注点(crosscutting concern)&#xff…

mybatis自己学习的一些总结

以前一直在使用spring的JDBCTEMPLATE和hibernate做项目&#xff1b;两个都还不错&#xff0c;spring的jdbctemplate用起来比较麻烦&#xff0c;虽然很简单。而hibernate呢&#xff0c;用起来很好用&#xff0c;很方便&#xff0c;但是很多规矩&#xff0c;规则还有方法到现在都…

SSL的TCP通信

一切尽在代码中&#xff0c;额&#xff0c;自己测试的小例子&#xff0c;感觉很有用&#xff0c;做个记录。 服务器端&#xff1a; </pre><pre name"code" class"java">package com.mpc.test.clazz;import java.io.BufferedReader; import ja…

java反射的使用概览

额&#xff0c;研究过这个的人很多很多&#xff0c;但是我没有很深入的研究过&#xff0c;所以谁也拦不住我去研究研究&#xff0c;然后记录下来如有雷同那就雷同了请多多包涵。 首先是整个项目的结构&#xff1a; 使用到的类&#xff1a; package reflect.demo;public class D…