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、然后是分配人员、任务启动、任务完成、流程关闭任务;任务是包含在流程中的

时间: 2024-10-11 09:33:27

Activiti5第十一弹,流程监听器与任务监听器的相关文章

框架 day56 BOS项目练习(activiti,历史数据操作,流程变量,任务组,监听器,网关,spring整合)

BOS项目笔记第10天 内容: 1.历史数据查询(历史流程实例数据.历史任务数据.历史活动数据) 2.流程变量 3.组任务(候选人.候选组) 4.监听器(执行.任务) 5.网关(排他.并行) 6.spring整合activiti 1.    历史数据查询 历史是一个组件,它可以捕获发生在进程执行中的信息并永久的保存,与运行时数据不同的是,当流程实例运行完成之后它还会存在于数据库中. 在流程引擎配置对象中可以设置历史记录规则: 1.1   查询历史流程实例数据 表中内容包含已经完成的流程和正在进行

Dynamic CRM 2013学习笔记(四十一)流程4 - 异步工作流(Workflow)用法图解

在CRM 2013 里,工作流被分成二类:异步工作流和实时工作流.异步工作流依赖一个windows 服务: Microsoft Dynamics CRM Asynchronous Processing Service , 这个服务必须在CRM 服务器上运行,否则异步工作流不会运行.异步工作流有可能不会立即执行,如果想要立即执行的工作流,可以考虑用实时工作流.CRM 里把它当作实体,所以可以在高级查找里查找它,还可以基于它生成报表.下面详细介绍如何使用异步工作流. 为了使用工作流,要注意权限是否打

Activiti5第十弹,RepositoryService

package org.mpc.final_activiti; import java.util.List; import org.activiti.engine.IdentityService; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.RepositoryService; import o

Activiti-master activiti5 在线java web流程设计器画布整合视频教程

本视频为activiti工作流的web流程设计器整合视频教程 整合Acitiviti在线流程设计器(Activiti-Modeler 5.21.0 官方流程设计器) 本视频共讲了两种整合方式 1. 流程设计器和其它工作流项目分开部署的方式 2. 流程设计器和SSM框架项目整合在一起的方式 视频大小 1.13 GB 本视频均为本人亲自录的,另免费附加赠送Activiti工作流视频(企业开发实例讲解) (这个赠送的Activiti工作流视频里面的流程设计器用的ecllipse的插件) 初衷:如今没有

activiti5/6 系列之--流程复用技术 callActivity

定义:当流程执行到callActivity,会创建一个新分支,它是到达调用节点的流程的分支. 这个分支会用来执行子流程,默认创建并行子流程,就像一个普通的流程. 上级流程会等待子流程完成,然后才会继续向下执行. XML: <callActivity id="callCheckCreditProcess" name="Check credit" calledElement="checkCreditProcess" /> 注意,子流程的流

Python3 学习第十一弹: 模块学习四之sys库

sys模块 提供一些与python解释器关系紧密的变量和函数 1> argv 命令行参数 通过命令行可以向python传输参数 2> exit([arg]) 程序退出,可以返回给命令行一个错误参数或返回值 ## test.py ## import sys i = 0 for argv in sys.argv: print('第', i, '个参数: ', argv) i += 1 exit(argv) 3> path 一个存储Python基本源模块的路径的列表,可以自行添加自定义模块路径

『PyTorch』第十一弹_torch.optim优化器

一.简化前馈网络LeNet import torch as t class LeNet(t.nn.Module): def __init__(self): super(LeNet, self).__init__() self.features = t.nn.Sequential( t.nn.Conv2d(3, 6, 5), t.nn.ReLU(), t.nn.MaxPool2d(2, 2), t.nn.Conv2d(6, 16, 5), t.nn.ReLU(), t.nn.MaxPool2d(2

『MXNet』第十一弹_符号式编程专题

一.符号分类 符号对我们想要进行的计算进行了描述, 下图展示了符号如何对计算进行描述. 我们定义了符号变量A, 符号变量B, 生成了符号变量C, 其中, A, B为参数节点, C为内部节点! mxnet.symbol.Variable可以生成参数节点, 用于表示计算时的输入. 二.常用符号方法 一个Symbol具有的属性和方法如下图所示: 关联节点查看 list_argument()用来检查计算图的输入参数; list_output()返回此Symbol的所有输出,输出的自动命名遵循一定的规则

十一、流程控制结构

目录 介绍 分支结构 一.if函数 二.case函数 三.if结构 循环结构 分类 循环控制 语法 语法 语法 案例 循环结构总结 小练习 介绍 顺序结构:程序从上至下依次执行 分支结构:程序从两条或多条路径中选择一条去执行 循环结构:程序在满足一定条件的基础上,重复执行一段代码 分支结构 一.if函数 功能: 实现简单的双分支 语法: select if(表达式1, 表达式2, 表达式3); 执行顺序: 如果表达式1成立,返回表达式2的值,否则返回表达式3的值 应用场景: 任何地方 二.cas