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

流程监听器


  1. package org.mpc.final_activiti;
  2. import java.io.Serializable;
  3. import org.activiti.engine.delegate.DelegateExecution;
  4. import org.activiti.engine.delegate.ExecutionListener;
  5. import org.activiti.engine.delegate.Expression;
  6. /**
  7. *
  8. * 可以使用 CLASS ,EXPRESSION,DELEGATE EXPRESSSION三种方式来创建监听器,这里使用第三种方式,其他两种方式和
  9. * 在servicetask中的使用方式相同
  10. *
  11. * */
  12. public class ExectuionListenerDemo implements Serializable, ExecutionListener {
  13. /**
  14. * @Fields serialVersionUID : TODO(用一句话描述这个变量表示什么)
  15. */
  16. private static final long serialVersionUID = 8513750196548027535L;
  17. private Expression message;
  18. public Expression getMessage() {
  19. return message;
  20. }
  21. public void setMessage(Expression message) {
  22. this.message = message;
  23. }
  24. @Override
  25. public void notify(DelegateExecution execution) throws Exception {
  26. System.out.println("流程监听器" + message.getValue(execution));
  27. }
  28. }

任务监听器


  1. package org.mpc.final_activiti;
  2. import java.io.Serializable;
  3. import org.activiti.engine.delegate.DelegateTask;
  4. import org.activiti.engine.delegate.Expression;
  5. import org.activiti.engine.delegate.TaskListener;
  6. /**
  7. *
  8. * 任务监听器,实现TaskListener接口
  9. *
  10. * */
  11. public class TaskListenerDemo implements Serializable, TaskListener {
  12. private Expression arg;
  13. public Expression getArg() {
  14. return arg;
  15. }
  16. public void setArg(Expression arg) {
  17. this.arg = arg;
  18. }
  19. @Override
  20. public void notify(DelegateTask delegateTask) {
  21. System.out.println("任务监听器:" + arg.getValue(delegateTask));
  22. }
  23. }

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

接着是流程定义图

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

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

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

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

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

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


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <process id="myProcess" name="My process" isExecutable="true">
  4. <extensionElements>
  5. <activiti:executionListener event="start" delegateExpression="${myprocessListener}">
  6. <activiti:field name="message">
  7. <activiti:string><![CDATA[流程启动]]></activiti:string>
  8. </activiti:field>
  9. </activiti:executionListener>
  10. <activiti:executionListener event="end" delegateExpression="${myprocessListener}">
  11. <activiti:field name="message">
  12. <activiti:string><![CDATA[流程结束]]></activiti:string>
  13. </activiti:field>
  14. </activiti:executionListener>
  15. </extensionElements>
  16. <startEvent id="startevent1" name="Start"></startEvent>
  17. <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway">
  18. <extensionElements>
  19. <activiti:executionListener event="start" delegateExpression="${myprocessListener}">
  20. <activiti:field name="message">
  21. <activiti:string><![CDATA[排他网关开始]]></activiti:string>
  22. </activiti:field>
  23. </activiti:executionListener>
  24. <activiti:executionListener event="end" delegateExpression="${myprocessListener}">
  25. <activiti:field name="message">
  26. <activiti:string><![CDATA[排他网关结束]]></activiti:string>
  27. </activiti:field>
  28. </activiti:executionListener>
  29. </extensionElements>
  30. </exclusiveGateway>
  31. <sequenceFlow id="flow3" sourceRef="startevent1" targetRef="exclusivegateway1"></sequenceFlow>
  32. <userTask id="usertask2" name="User Task" activiti:assignee="${user}">
  33. <extensionElements>
  34. <activiti:taskListener event="create" delegateExpression="${mytaskListener}">
  35. <activiti:field name="arg">
  36. <activiti:string><![CDATA[任务启动]]></activiti:string>
  37. </activiti:field>
  38. </activiti:taskListener>
  39. <activiti:taskListener event="assignment" delegateExpression="${mytaskListener}">
  40. <activiti:field name="arg">
  41. <activiti:string><![CDATA[分配人员]]></activiti:string>
  42. </activiti:field>
  43. </activiti:taskListener>
  44. <activiti:taskListener event="complete" delegateExpression="${mytaskListener}">
  45. <activiti:field name="arg">
  46. <activiti:string><![CDATA[任务完成]]></activiti:string>
  47. </activiti:field>
  48. </activiti:taskListener>
  49. <!-- 在可视化工具中无法给usertask加上流程监听器,但是,我们在xml中可以自己敲进去· -->
  50. <activiti:executionListener event="start" delegateExpression="${myprocessListener}">
  51. <activiti:field name="message">
  52. <activiti:string><![CDATA[流程启动任务]]></activiti:string>
  53. </activiti:field>
  54. </activiti:executionListener>
  55. <activiti:executionListener event="end" delegateExpression="${myprocessListener}">
  56. <activiti:field name="message">
  57. <activiti:string><![CDATA[流程关闭任务]]></activiti:string>
  58. </activiti:field>
  59. </activiti:executionListener>
  60. <!-- ........................................................................................................................................ -->
  61. </extensionElements>
  62. </userTask>
  63. <sequenceFlow id="flow4" sourceRef="exclusivegateway1" targetRef="usertask2">
  64. <extensionElements>
  65. <activiti:executionListener event="take" delegateExpression="${myprocessListener}">
  66. <activiti:field name="message">
  67. <activiti:string><![CDATA[从排他网关到用户任务,好长的一段路]]></activiti:string>
  68. </activiti:field>
  69. </activiti:executionListener>
  70. </extensionElements>
  71. </sequenceFlow>
  72. <intermediateThrowEvent id="noneintermediatethrowevent1" name="NoneThrowEvent">
  73. <extensionElements>
  74. <activiti:executionListener event="start" delegateExpression="${myprocessListener}">
  75. <activiti:field name="message">
  76. <activiti:string><![CDATA[中间事件开始]]></activiti:string>
  77. </activiti:field>
  78. </activiti:executionListener>
  79. <activiti:executionListener event="end" delegateExpression="${myprocessListener}">
  80. <activiti:field name="message">
  81. <activiti:string><![CDATA[中间事件结束]]></activiti:string>
  82. </activiti:field>
  83. </activiti:executionListener>
  84. </extensionElements>
  85. </intermediateThrowEvent>
  86. <sequenceFlow id="flow5" sourceRef="usertask2" targetRef="noneintermediatethrowevent1"></sequenceFlow>
  87. <endEvent id="endevent1" name="End"></endEvent>
  88. <sequenceFlow id="flow6" sourceRef="noneintermediatethrowevent1" targetRef="endevent1"></sequenceFlow>
  89. </process>
  90. <bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
  91. <bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
  92. <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
  93. <omgdc:Bounds height="35.0" width="35.0" x="160.0" y="180.0"></omgdc:Bounds>
  94. </bpmndi:BPMNShape>
  95. <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
  96. <omgdc:Bounds height="40.0" width="40.0" x="240.0" y="130.0"></omgdc:Bounds>
  97. </bpmndi:BPMNShape>
  98. <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
  99. <omgdc:Bounds height="55.0" width="105.0" x="325.0" y="123.0"></omgdc:Bounds>
  100. </bpmndi:BPMNShape>
  101. <bpmndi:BPMNShape bpmnElement="noneintermediatethrowevent1" id="BPMNShape_noneintermediatethrowevent1">
  102. <omgdc:Bounds height="35.0" width="35.0" x="475.0" y="133.0"></omgdc:Bounds>
  103. </bpmndi:BPMNShape>
  104. <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
  105. <omgdc:Bounds height="35.0" width="35.0" x="555.0" y="133.0"></omgdc:Bounds>
  106. </bpmndi:BPMNShape>
  107. <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
  108. <omgdi:waypoint x="195.0" y="197.0"></omgdi:waypoint>
  109. <omgdi:waypoint x="260.0" y="170.0"></omgdi:waypoint>
  110. </bpmndi:BPMNEdge>
  111. <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
  112. <omgdi:waypoint x="280.0" y="150.0"></omgdi:waypoint>
  113. <omgdi:waypoint x="325.0" y="150.0"></omgdi:waypoint>
  114. </bpmndi:BPMNEdge>
  115. <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
  116. <omgdi:waypoint x="430.0" y="150.0"></omgdi:waypoint>
  117. <omgdi:waypoint x="475.0" y="150.0"></omgdi:waypoint>
  118. </bpmndi:BPMNEdge>
  119. <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
  120. <omgdi:waypoint x="510.0" y="150.0"></omgdi:waypoint>
  121. <omgdi:waypoint x="555.0" y="150.0"></omgdi:waypoint>
  122. </bpmndi:BPMNEdge>
  123. </bpmndi:BPMNPlane>
  124. </bpmndi:BPMNDiagram>
  125. </definitions>

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

然后就是测试代码


  1. package final_activiti.progress;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import org.activiti.engine.impl.test.PluggableActivitiTestCase;
  5. import org.activiti.engine.test.Deployment;
  6. import org.junit.Test;
  7. import org.mpc.final_activiti.ExectuionListenerDemo;
  8. import org.mpc.final_activiti.TaskListenerDemo;
  9. public class ListenersTest extends PluggableActivitiTestCase {
  10. @Test
  11. @Deployment(resources = "final_activiti/progress/listeners.bpmn")
  12. public void test() {
  13. Map<String, Object> map = new HashMap<String, Object>();
  14. map.put("myprocessListener", new ExectuionListenerDemo());
  15. map.put("mytaskListener", new TaskListenerDemo());
  16. map.put("user", "mpc");
  17. runtimeService.startProcessInstanceByKey("myProcess", map);
  18. taskService.complete(taskService.createTaskQuery().singleResult()
  19. .getId());
  20. ;
  21. }
  22. }

测试结果:

分析:

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

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

原文地址:https://blog.csdn.net/u012613903/article/details/43732941

Activiti5----流程监听器与任务监听器的更多相关文章

  1. 工作流Activiti5流程变量 任务变量 setVariables 跟 setVariablesLocal区别

    工作流Activiti5流程变量 任务变量 setVariables 和 setVariablesLocal区别 因为网上的资料比较少.结合源码把相关API写下来. 设置流程级别变量: runtime ...

  2. JMeterPlugins插件监听器学习-监听器

    JMeterPlugins插件监听器学习-监听器 1.jp@gc - Actiive Threads Over Time:不同时间活动用户数量展示(图表)2.jp@gc - AutoStop List ...

  3. session监听器和Attribute监听器

    session监听器 有一个web项目,每次一个新的浏览器链接,都会走下面SessionListerenr 方法,该技术可用于网站当前用户的统计 package com.cisst.controlle ...

  4. Java程序员从笨鸟到菜鸟之(二十一)java过滤器和监听器详解 【转】

     过滤器 1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请 ...

  5. activiti监听器使用

    分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) activiti使用的时候,通常需要跟业务紧密的结合在一起,有些业 ...

  6. 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件

    博客地址 : http://blog.csdn.net/shulianghan/article/details/41520569 代码下载 : -- GitHub : https://github.c ...

  7. 在Java Web程序中使用监听器可以通过以下两种方法

    之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...

  8. 面试题:filter过滤器 listener 监听器 案例有点用

    1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行 ...

  9. java过滤器和监听器详解

    过滤器 1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求 ...

随机推荐

  1. Leetcode572.Subtree of Another Tree另一个树的子树

    给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 1: 给定的树 ...

  2. 低价替代Vector CANoe CAN总线适配解决方案支持所有USBCAN(周立功CAN、PCAN、Kvaser、ValueCAN、NI CAN)

    在汽车通信领域CAN总线使用非常广泛,最强大的工具有Vector Case(10WRMB).Pcan(2KRMB),ZLGCAN(1.5KRMB),KVASER(2KRMB).ValueCAN(4KR ...

  3. android rsa 示例

    1.参考资料 1.1 android的Cipher官方文档 https://developer.android.com/reference/javax/crypto/Cipher 其中 构造Ciphe ...

  4. hihocoder1317 :搜索四·跳舞链

    精确覆盖问题是指对于给定的一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1. //Achen #include<algorithm> #include< ...

  5. 【JZOJ5064】【GDOI2017第二轮模拟day2】友好城市 Kosarajo算法+bitset+ST表+分块

    题面 在Byteland 一共有n 座城市,编号依次为1 到n,这些城市之间通过m 条单向公路连接. 对于两座不同的城市a 和b,如果a 能通过这些单向道路直接或间接到达b,且b 也能如此到达a,那么 ...

  6. node.js对象数据类型

    在这里复习下前端JS的数据类型:前端JS中的数据类型: 1.基本/原生/值类型 string.number.boolean.null.undefined 2.引用/对象类型    ES对象类型:Str ...

  7. 一个基于Asterisk构建的VOIP应用软件:Elastix介绍

    Elastix 是一种应用软件,它整合了适用于那些基于 Asterisk 的 PBX 的最好工具,并将它们集成为单一的.易用的接口.同时,它增加了自己的工具集,以及允许创建第三方模块来使 Elasti ...

  8. iOS支付宝2.0 SDK集成整理

    https://cshall.alipay.com/enterprise/help_detail.htm?help_id=473890 http://wenku.baidu.com/link?url= ...

  9. 跨域知识(一)——CORS

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...

  10. hdu5443 线段树 长春网赛

    #include<stdio.h> #include<string.h> #define lson l,m,rt<<1 #define rson m+1,r,rt& ...