BPMN2.0学习——(2)BPMN2.0事件分类介绍与定时任务讲解_bpmn的定时开启任务-程序员宅基地

技术标签: 事件类型  bpmn  BPMN2.0规范  定时事件  event  

我们可以看下图,关于事件相关的矩阵图形,展现了各种BPMN中的图案效果。

事件分类方式:

1、按照位置分类:

      开始事件 - 表示流程的开始,使用哪种方式触发流程的开始就是对应各个不同的开始事件。

      中间事件 - 出现在流程中可以单独作为一个流程节点展示的事件。

      结束事件 - 标志流程结束,分为正常结束、异常结束与执行完成后抛出一个消息或信号。

2、按照特性分类:

      捕获事件(Catching) - 是一直在等待被触发的事件,比如所有开始事件都是被等待触发的事件。

      抛出事件(Throwing) - 是执行到某一节点自动执行并抛出结果,比如结束事件可以自动执行并返回结果。

3、按照事件定义分类:

      定时事件 - 可以作为开始事件与捕获事件及边界事件。

      错误事件 - 图中为闪电的是错误事件,可以为中断子过程事件、中断便捷事件与结束事件。

      信号事件 - 存在所有的维度。

      消息事件 - 存在所有的维度。

对BPMN的事件进行分类后开始对具体事件进行介绍。

定时事件

定义:

  • 指定时间(timeDate) - 给事件指定执行的时间
  • 指定持续时间(timeDuration) - 例如流程部署五分钟或十分钟后执行。
  • 周期执行(timeCycle) - 可以与指定持续时间相结合,例如部署后五分钟执行,然后每十分钟执行一次、

下面举个例子:

<timerEventDefinition>
    <timeDate>2019-03-03T11:11:00</timeDate>
</timerEventDefinition>

在timeEventDefinition标签中指定定时事件的类型,这里使用指定时间类型,将会在2019年3月3日十一点十一分执行。

然后我们看看一个简单的定时事件流程:

流程图定义文件如下:

<startEvent id="timerstartevent" name="Timer start">
    <timerEventDefinition>
        <timeCycle>R5/PT5M</timeCycle>
    </timerEventDefinition>
</startEvent >

定时边界事件

流程图例子:

这个流程是正常执行流程时,如果超时,则执行Timeout Task事件再结束。

流程定义文件如下:

<userTask id="commonTask" name="Common Task"></userTask>
<boundaryEvent id="boundarytimer" name="Timer"
    attachedToRef="commonTask" cancelActivity="true">
    <timerEventDefinition>
        <timeDuration>PT5H</timeDuration>
    </timerEventDefinition>
</boundaryEvent>

接下来我们使用代码来测试一下:

1、首先创建maven项目,并创建测试流程图

创建好maven项目后,在resources中创建 my-process-timer-boundary.bpmn20.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: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="my-process">
		<startEvent id="startEvent" name="startEvent"/>
		<userTask id="commonTask" name="Common Task"/>
		<boundaryEvent attachedToRef="commonTask" id="boundaryEvent"
					   name="Timer" cancelActivity="true">   <!-- 定义边界事件,并且可以取消这个流程 -->
			<timerEventDefinition>  <!-- 定义时间定义器 -->
				<timeDuration>PT5S</timeDuration>    <!-- 流程部署后5秒再执行 -->
			</timerEventDefinition>
		</boundaryEvent>
		<userTask id="timeoutTask" name="Timeout Task"></userTask>   <!-- 如果commonTask没有在规定时间内完成,则执行这个userTask -->
		<endEvent id="end1"></endEvent>
		<endEvent id="end2"></endEvent>

		<!-- 然后将事件相连,使用sequenceFlow -->
		<sequenceFlow sourceRef="startEvent" targetRef="commonTask"/>
		<sequenceFlow sourceRef="commonTask" targetRef="end1"/>
		<sequenceFlow sourceRef="boundaryEvent" targetRef="timeoutTask"/>
		<sequenceFlow sourceRef="timeoutTask" targetRef="end2"/>
	</process>

</definitions>

这里定义了两个事件,一个普通事件与一个边界时间,如果超时则执行 timeoutTask 事件。

2、修改 activiti.cfg.xml 流程定义配置

修改后内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
    <property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000;MVCC=TRUE" />
    <property name="jdbcDriver" value="org.h2.Driver" />
    <property name="jdbcUsername" value="sa" />
    <property name="jdbcPassword" value="" />
    <property name="asyncExecutorActivate" value="true"/>     <!-- 因为涉及到定时任务,所以要把异步执行器打开 -->
    <property name="enableDatabaseEventLogging" value="true"/>     <!-- 为了看执行原理,要开启一个可见的日志 -->
  </bean>

</beans>

除了基本的数据库配置后,添加了两项内容:因为涉及到定时任务,所以要把异步执行器打开;并且为了更方便的看执行原理,还打开了一个可见的日志。

3、创建 TimerEventTask 测试类

首先在test下创建bpmn20包再创建 TimerEventTask 测试类:

测试类的内容如下:

package com.jjf.activiti.bpmn20;

import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.ActivitiRule;
import org.activiti.engine.test.Deployment;
import org.junit.Rule;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * test
 */
public class TimerEventTask {
    private static final Logger LOGGER = LoggerFactory.getLogger(TimerEventTask.class);

    @Rule
    public ActivitiRule activitiRule = new ActivitiRule();

    @Test
    @Deployment(resources = {"my-process-timer-boundary.bpmn20.xml"})
    public void testTimerBoundary() throws InterruptedException {
        ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process");   //启动这个流程

        List<Task> tasks = activitiRule.getTaskService().createTaskQuery().listPage(0, 100);    //查询Task列表
        for (Task task:tasks){   //遍历输出task
            LOGGER.info("task.name = [{}]" , task.getName());
        }
        LOGGER.info("task.size = [{}]" , tasks.size());

        Thread.sleep(1000*15);    //让程序睡眠15s

        //再重新执行看看遍历的task事件
        tasks = activitiRule.getTaskService().createTaskQuery().listPage(0, 100);    //查询Task列表
        for (Task task:tasks){   //遍历输出task
            LOGGER.info("task.name = [{}]" , task.getName());
        }
        LOGGER.info("task.size = [{}]" , tasks.size());
    }
}

这里我们启动流程后输出此时的task,然后使用Thread让程序睡眠15s后再重新执行查看遍历出来的task事件。

4、测试执行

单元测试结果如下:

Loading XML bean definitions from class path resource [activiti.cfg.xml]
Activiti 5 compatibility handler implementation not found or error during instantiation : org.activiti.compatibility.DefaultActiviti5CompatibilityHandler. Activiti 5 backwards compatibility disabled.
performing create on engine with resource org/activiti/db/create/activiti.h2.create.engine.sql
performing create on history with resource org/activiti/db/create/activiti.h2.create.history.sql
performing create on identity with resource org/activiti/db/create/activiti.h2.create.identity.sql
ProcessEngine default created
Starting up the default async job executor [org.activiti.engine.impl.asyncexecutor.DefaultAsyncJobExecutor].
Creating thread pool queue of size 100
Creating executor service with corePoolSize 2, maxPoolSize 10 and keepAliveTime 5000
{} starting to acquire async jobs due
{} starting to acquire async jobs due
{} starting to reset expired jobs
task.name = [Common Task]
task.size = [1]
task.name = [Timeout Task]
task.size = [1]

可以看到我们这里睡眠了15s后则会执行Timeout Task事件。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JJBOOM425/article/details/88186282

智能推荐

Iperf 报错:read failed: No route to host_iperf no route to host-程序员宅基地

文章浏览阅读1.4w次,点赞2次,收藏8次。调试Cent OS 7.5的系统的IPerf,发现server端,无法打印出来的间隔接受率等信息,client也报错,报错显示如下[root@localhost ~]# iperf -u -c 192.168.108.61 -i1 -t9999999999 -b 3M -l 1200----------------------------------------------------------..._iperf no route to host

Linux负载命令_linux 负载-程序员宅基地

文章浏览阅读995次。Linux查看负载的命令_linux 负载

站长工具大全,站长工具哪个好用,站长在线工具-程序员宅基地

文章浏览阅读2.9w次。在每日的seo工作中,相信以上很多工具大家都会经常用到这些实用的SEO工具,坚持用这些工具为给我们的工作带来意想不到的效果,一定要坚持下去。我只能说,各有千秋,站长之家的权重计算比较低,所以大家一看有权重心理问题觉得站长之家好,爱站权重计算较高所以站长之家有权重在爱站却没有。站长和爱站主要是权重不太一样,爱站的低一些,不过无论是站长还是爱站都是自己的算法,等搜索引擎没有公布任何权重的算法。对于站长工具每个站长需求不一样,所以没有所谓的哪个好用,另个每个站长工具都有其特点,适合自己的才是最好的。...

机器人行业_2019年机器人及自动化系统所处行业阶段-程序员宅基地

文章浏览阅读2.9k次。第一部分全球 机器人行业发展趋势一、全球机器人行业重点企业股价趋势在研究机器人龙头企业股价过程中,我们发现这些企业的股价无论是在一个较长的时间内,还是在近几年,都呈现上涨的态势。从全球范围看,机器人行业仍处于上升期。随着机器人技术的进步,以及中国等发展中国家人口红利耗尽,自动化大趋势不可挡,也为机器人行业发展提供了先决条件。(1)近五年机器人四大龙头企业股价呈涨势随着全球经济从20_2019年机器人及自动化系统所处行业阶段

前端组件之Bootstrap与Ant design of Vue_bootstrap与antd-程序员宅基地

文章浏览阅读5.4k次,点赞4次,收藏6次。架构1、前言2、Bootstra跟Ant design对比2.1 简介2.1.1 Bootstrap2.1.2 Ant design2.2 特性2.2.1 Bootstrap2.2.2 Ant Design Of Vue2.3 入门条件BootstrapAnt Design Of Vue2.4 部分组件的显示效果以及代码2.4.1 导航条2.4.2 巨幕2.5 栅格系统3、两个强大组件库的一些共性总而言之1、前言本文仅面向前端初始学习者,当然也欢迎大犇来指正其中错误玩前端的新手,或多或少地会见过并_bootstrap与antd

发票批量查验软件(自动保存官网查验截图)91发票查验助手-程序员宅基地

文章浏览阅读3.7w次。发票批量查验软件(自动保存官网查验截图)91发票查验助手_91发票查验助手

随便推点

【UE4】 VS2019编译源码错误 error C4800_vs2019 memory(3382): error c4800: 从“_ty”到 bool 的隐式-程序员宅基地

文章浏览阅读1k次。参考文章https://blog.csdn.net/weixin_43030629/article/details/104947160._vs2019 memory(3382): error c4800: 从“_ty”到 bool 的隐式转换。信息可能丢失

ROS中开源激光slam(2D)[gmapping hector karto cartographer]_karto 定位-程序员宅基地

文章浏览阅读8.1k次,点赞5次,收藏43次。ROS中开源激光slam(2D)[gmapping hector karto cartographer]_karto 定位

在配置hibernate-程序员宅基地

文章浏览阅读1k次,点赞8次,收藏20次。资料过多,篇幅有限,需要文中全部资料可以点击这里免费获取前端面试资料PDF完整版!自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。整版!**自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。

java计算机毕业设计随心淘网管理系统源代码+数据库+系统+lw文档-程序员宅基地

文章浏览阅读203次。java计算机毕业设计随心淘网管理系统源代码+数据库+系统+lw文档。springboot基于B_S架构的疫情包联信息管理系统的设计与实现。springboot基于精细化考核的离散数学课程教学目标达成系统。springboot基于Springboot的大学宿舍管理系统。ssm临港新片区招商引资项目管理系统的设计与实现。_jsp__access_在线网络购物系统_ssm疫情背景下基于web的学生信息日报系统。JSP广告公司网站的设计与实现mysql。jsp基于javaweb的公益募捐网站。

Oracle19c安装及监听配置&PLSQL Developer安装-程序员宅基地

文章浏览阅读233次。首先,在“开始”菜单栏中找到Oracle-OraDB19Home1(因安装版本不同可能会有差异),接着打开Net Configuration Assistant,进行监听程序的配置;使用dos命令(windows徽标+R--输入cmd)/菜单栏搜索框直接输入cmd,输入lsnrctl status;监听程序配置完成后再通过cmd输入lsnrctl status命令,测试如下则说明监听程序已配置完成;Oracle主目录用户口令即在下载Oracle时自定义的口令密码;若如下图显示则是尚未开启监听程序;

Java中8种常见的数据结构_java数据结构-程序员宅基地

文章浏览阅读152次。数组、链表、堆、栈、队列、树、哈希、图。_java数据结构

推荐文章

热门文章

相关标签