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;
-
}
-
-
@Override
-
public 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;
-
}
-
-
@Override
-
public 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、然后是分配人员、任务启动、任务完成、流程关闭任务;任务是包含在流程中的
原文地址:https://blog.csdn.net/u012613903/article/details/43732941
Activiti5----流程监听器与任务监听器的更多相关文章
- 工作流Activiti5流程变量 任务变量 setVariables 跟 setVariablesLocal区别
工作流Activiti5流程变量 任务变量 setVariables 和 setVariablesLocal区别 因为网上的资料比较少.结合源码把相关API写下来. 设置流程级别变量: runtime ...
- JMeterPlugins插件监听器学习-监听器
JMeterPlugins插件监听器学习-监听器 1.jp@gc - Actiive Threads Over Time:不同时间活动用户数量展示(图表)2.jp@gc - AutoStop List ...
- session监听器和Attribute监听器
session监听器 有一个web项目,每次一个新的浏览器链接,都会走下面SessionListerenr 方法,该技术可用于网站当前用户的统计 package com.cisst.controlle ...
- Java程序员从笨鸟到菜鸟之(二十一)java过滤器和监听器详解 【转】
过滤器 1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请 ...
- activiti监听器使用
分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) activiti使用的时候,通常需要跟业务紧密的结合在一起,有些业 ...
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
博客地址 : http://blog.csdn.net/shulianghan/article/details/41520569 代码下载 : -- GitHub : https://github.c ...
- 在Java Web程序中使用监听器可以通过以下两种方法
之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
- 面试题:filter过滤器 listener 监听器 案例有点用
1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行 ...
- java过滤器和监听器详解
过滤器 1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求 ...
随机推荐
- 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山
前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...
- Codevs2490 导弹防御塔
2490 导弹防御塔 2490 导弹防御塔 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description Freda的城堡—— ...
- pytest 用 @pytest.mark.usefixtures("fixtureName")或@pytest.fixture(scope="function", autouse=True)装饰,实现类似setup和TearDown的功能
conftest.py import pytest @pytest.fixture(scope="class") def class_auto(): print("&qu ...
- ML面试1000题系列(81-90)
本文总结ML面试常见的问题集 转载来源:https://blog.csdn.net/v_july_v/article/details/78121924 81.已知一组数据的协方差矩阵P,下面关于主分量 ...
- python 从数据库取回来的数据中文显示为乱码
问题:从数据库取回来的数据,中文显示为乱码. 解决办法: 此处要指定charset为utf-8(一般数据库编码都是utf8),否则读取出的中文会乱码
- iOS 7: 如何为iPhone 5s编译64位应用
随着iPhone 5S的推出,大家开始关心5S上所使用的64位CPU A7. 除了关心A7的性能以外,大家还会关心一个问题,那就是使用A7的64位系统对应用有没有什么要求.特别是应用开发者,大家都比较 ...
- hdu 1671&& poj 3630 (trie 树应用)
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 25280 Accepted: 7678 Descr ...
- CSS浏览器兼容解决方案
1.在ie8的甑别上,如何让样式只对ie8起作用? 用ie浏览器独有的文档注释的方式.像这样: <!DOCTYPE html> <!--> <html class=&qu ...
- Directx11教程(19) 画一个简单的地形
原文:Directx11教程(19) 画一个简单的地形 通常我们在xz平面定义一个二维的网格,然后y的值根据一定的函数计算得到,比如正弦.余弦函数的组合等等,可以得到一个看似不错的地形或者 ...
- Person Re-identification 系列论文笔记(八):SPReID
Human Semantic Parsing for Person Re-identification Kalayeh M M, Basaran E, Gokmen M, et al. Human S ...