`
Kevin12
  • 浏览: 237088 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jbpm4 timer 定时器事件

阅读更多
最近学习了jbpm4.X的定时器事件,下面是一个简单的测试,上一篇简单介绍了jbpm4初始化数据库,这次可以从数据库中查看详细的流程执行信息。
流程定义文件:TimerEventTest.jpdl.xml
<?xml version="1.0" encoding="UTF-8"?>

<process name="TimerEventTest" xmlns="http://jbpm.org/4.4/jpdl">
   <start g="44,111,48,48" name="start1">
      <transition g="-50,-18" name="to guardedWait" to="guardedWait"/>
   </start>
   <state g="181,108,140,52" name="guardedWait">
   	<on event="timeout">
      <timer duedate="1 minutes"/> 
      <event-listener class="com.lujinyong.timer.event.Escalate"/> 
    </on>  
      <transition g="-34,-20" name="go on" to="next step"/>
   </state>
   <state g="442,106,92,52" name="next step"/>
</process>

定时器到到期时间触发的事件:Escalate.java
package com.lujinyong.timer.event;

import org.jbpm.api.listener.EventListener;
import org.jbpm.api.listener.EventListenerExecution;

/**
 * 监听事件
 */
public class Escalate implements EventListener {

	private static final long serialVersionUID = 1L;

	public void notify(EventListenerExecution execution) {
		//触发监听事件,会将变量插入流程变量表(jbpm4_variable)中
		execution.setVariable("escalation", Boolean.TRUE);
		String mag = "超时了,我要发提醒信息!";
		execution.setVariable("mag", mag);
	}
}

测试类TestTimerEvent2.java
package com.lujinyong.timer.event;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import org.jbpm.api.Configuration;
import org.jbpm.api.Execution;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ManagementService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.job.Job;
import org.junit.Test;

public class TestTimerEvent2 {
	/**
	 * 
	 * @Description: 部署流程
	 * @Auther: lujinyong
	 * @Date: 2013-6-24 下午03:41:01
	 */
	@Test
	public void testDeploy1() {
		// 1.get processEngine
		ProcessEngine processEngine = Configuration.getProcessEngine();
		//如果不用图片可以将:.addResourceFromClasspath(	"com/lujinyong/timer/event/TimerEventTest.png")去掉
		processEngine
				.getRepositoryService()
				.createDeployment()
				.addResourceFromClasspath(
						"com/lujinyong/timer/event/TimerEventTest.jpdl.xml")
				.addResourceFromClasspath(
						"com/lujinyong/timer/event/TimerEventTest.png").deploy();
	}
	/**
	 * 
	 * @Description: 测试发起流程,注意:名称发起流程后将发起的方法注释起来,在下面的测试中才不会多出发起的记录
	 * @Auther: lujinyong
	 * @Date: 2013-6-24 下午03:50:31
	 */
	@Test
	public void testStart() {
		ProcessEngine processEngine = Configuration.getProcessEngine();
		// 根据流程定义id发起流程
//		String processDefinitionId = "TimerTransitionTest-2";
//		Execution processInstance = processEngine.getExecutionService()
//				.startProcessInstanceById(processDefinitionId);
		// 根据流程定义key发起流程
//		String processDefinitionKey = "TimerEventTest";
//		ExecutionService executionService = processEngine.getExecutionService();
//		ManagementService managementService = processEngine.getManagementService();
//		Execution processInstance = executionService.startProcessInstanceByKey(processDefinitionKey);
		
//		Execution processInstance = executionService.createProcessInstanceQuery().processInstanceKey(processDefinitionKey).list().get(0);
//		System.out.println("piID:" + processInstance.getId());
//		System.out.println("pdKey:" + processInstance.getKey());
//		System.out.println("pdid:" + processInstance.getProcessDefinitionId());
//		System.out.println("pdState:" + processInstance.getState());
	}
	/**
	 * 
	 * @Description: 测试超时的情况
	 * 如果流程没有在开始以后 10 分钟内执行 singal, 
	 * 事件 timeout 就会被触发 事件监听器com.lujinyong.timer.event.Escalate 将被触发
	 * 即在流程变量表中会插入监听类的一条记录
	 * @Auther: lujinyong
	 * @Date: 2013-6-24 下午05:38:35
	 */
	@Test
	public void testTimerEventTimerFires() {
		ProcessEngine processEngine = Configuration.getProcessEngine();
		ExecutionService executionService = processEngine.getExecutionService();
		ManagementService managementService = processEngine.getManagementService();
	    ProcessInstance processInstance = executionService.startProcessInstanceByKey("TimerEventTest");
	    //查询定时器
	    Job job = managementService.createJobQuery()
	      .processInstanceId(processInstance.getId())
	      .uniqueResult();
	    //假设定时器被触发了,通过编码执行定时器进行模拟
	    managementService.executeJob(job.getId());

	    processInstance = executionService.findProcessInstanceById(processInstance.getId());

	    Set<String> expectedActivityNames = Collections.singleton("guardedWait");
	    assertEquals(expectedActivityNames, processInstance.findActiveActivityNames());
	    
	    assertEquals(Boolean.TRUE, executionService.getVariable(processInstance.getId(), "escalation"));
	    System.out.println(">>>>>>>>>>>>>>>>>>"+executionService.getVariable(processInstance.getId(), "mag"));
	  }
	/**
	 * 
	 * @Description: 测试未超时的情况
	 * 如果 guardedWait 活动在 10 分钟内被结束,
	 * 然后定时器就会被取消, Escalate 事件监听器也不会执行
	 * 即流程变量表中不会插入监听类的记录
	 * @Auther: lujinyong
	 * @Date: 2013-6-24 下午05:39:45
	 */
//	@Test
//	public void testTimerEventContinueBeforeTimerFires() {
//		ProcessEngine processEngine = Configuration.getProcessEngine();
//		ExecutionService executionService = processEngine.getExecutionService();
//		ManagementService managementService = processEngine.getManagementService();
//		ProcessInstance processInstance = executionService.startProcessInstanceByKey("TimerEventTest");
//	    
//	    String executionId = processInstance.findActiveExecutionIn("guardedWait").getId();
//
//	    executionService.signalExecutionById(executionId, "go on");
//	    
//	    processInstance = executionService.findProcessInstanceById(processInstance.getId());
//	    
//	    assertTrue(processInstance.isActive("next step"));
//
//	    List<Job> jobs = managementService.createJobQuery()
//	      .processInstanceId(processInstance.getId())
//	      .list();
//	    
//	    assertEquals(new ArrayList<Job>(), new ArrayList<Job>(jobs));
//	  }
	
}

分享到:
评论

相关推荐

    JBPM4 常用表结构及其说明

    ### JBPM4 常用表结构及其说明 ...通过上述表格和说明,我们可以清楚地了解JBPM4如何管理和记录流程的各种状态和事件。这些信息对于开发者来说非常重要,可以帮助他们更好地理解和维护基于JBPM4构建的应用程序。

    JBPM4 java源代码分包详解JBPM4

    13. **org.jbpm.pvm.internal.job**: 包含对job、message和timer的实现,提供定时器服务,允许在特定时间或条件触发流程操作。 14. **org.jbpm.pvm.internal.jobexecutor**: 提供任务执行器,包括`...

    JBPM4 每张表对应的含义

    此表管理定时任务信息,如定时器(Timer)。这是实现流程中定时触发事件的关键机制。 #### 18. `JBPM4_PROPERTY` `JBPM4_PROPERTY`表用于存储系统级别的配置信息,如Hibernate设置等。这些信息对于系统的正常运行...

    JBPM4的17张表说明.docx

    JBPM4_JOB 表存放的是 Timer 的定义。这张表记录了定时器的信息,包括定时器的名称、类型和触发时间。 JBPM4 的 17 张表构成了一个完整的流程管理系统,负责管理和执行业务流程。了解这些表的作用和关系是使用 JBPM...

    JBPM数据库表说明 jbpm 工作流 详细到每一个字段,不要下载分

    2.8 JBPM_TIMER:流程定时器表 19 2.9 JBPM_TOKENVARIABLEMAP:流程TOKEN变量MAP表 19 2.10 JBPM_MODULEINSTANCE:流程模块实例表 20 2.11 JBPM_BYTEARRAY:文件模块形式的流程变量实例表 20 2.12 JBPM_...

    JBPM4开发手册,相当不错的资源

    其中包括定时器(timer)和 group 的相关特性,如定时器的持续时间表达式、工作日历、流向、事件、工作时间和重复设置,以及 group 的不同类型和使用方法。 【从 jBPM3 转换到 jBPM4】章节是专门为已经熟悉 jBPM3 ...

    JBPM4开发说明文档

    - **Timer定时器**: - **持续时间表达式**:定义定时器的持续时间。 - **工作日历**:用于根据特定日期和时间安排定时器的触发。 - **定时器流向**:定义定时器触发后的工作流方向。 - **定时器事件**:处理...

    JBPM4工作流应用开始指南.rar

    深入jPDL和jBPM Service API 201 10.1 timer(定时器)能为您做什么 201 10.1.1 持续时间表达式 202 10.1.2 工作日历 202 10.1.3 定时转移 204 10.1.4 定时事件 205 10.1.5 工作日历定时 207 10.1.6 定时重复 208 ...

    jBPM 4.4 开发指南pdf版

    这一节详细介绍了jBPM中的Timer定时器功能及其使用方法。 ###### 2.1.1 持续时间表达式 - **2.1.1.1 基本时间**:定义了基本时间单位,如秒、分钟、小时等。 - **2.1.1.2 例子**:通过具体示例展示了如何设置不同...

    jBPM 4.4开发指南

    - **Timer定时器**:定时器是jBPM中用于控制流程执行时间的关键组件,可以设置在特定时间或间隔触发流程事件。 - **工作日历**:工作日历允许设定工作时间,比如排除周末和节假日,确保定时器在工作日内触发。 - ...

    JBPM工作流开发指南

    3.3.18 create-timer(创建定时器) 25 3.3.19 cancel-timer(取消定时器) 26 3.3.20 task(任务) 26 3.3.21 swimlane(泳道) 27 3.3.22 assignment(委派) 28 3.3.23 controller(控制器) 29 3.3.24 process-state 子流程 ...

    jbpm数据库表结构

    - **JBPM_TIMER**:计时表,记录流程中的定时器信息。 - **JBPM_POOLEDACTOR**:汇集参与者表,记录参与者的信息。 - **JBPM_RUNTIMEACTION**:运行中行为表,记录运行中的操作信息。 - **JBPM_LOG**:流程日志...

    jBPM 4.4 开发指南

    #### 2.1 timer定时器 - **持续时间表达式**:详细解释了如何使用时间表达式来设定定时器的触发条件,包括基本时间和具体示例。 - **工作日历**:介绍如何根据实际工作日安排调整定时器的执行策略。 - **定时器流向...

    jBPM-4.0开发手册

    - **2.1 Timer定时器** - **2.1.1 持续时间表达式** 定时器功能允许在流程中设置特定的时间延迟。持续时间表达式是用来指定定时器何时触发的关键部分。这种表达式可以非常灵活,例如可以设置为特定的日期和时间...

    JBPM数据库表说明.doc

    #### 2.8 JBPM_TIMER 定义了流程中的定时器,用于触发特定时间点的动作。 #### 2.9 JBPM_TOKENVARIABLEMAP 存储流程令牌与变量之间的映射关系,反映流程实例中的变量状态。 #### 2.10 JBPM_MODULEINSTANCE 记录...

    JBPM数据库表关系

    - **JBPM_EVENT**: 描述流程中的事件,如定时器、信号等。 - **JBPM_EXCEPTIONHANDLER**: 存储异常处理规则,当流程运行中遇到错误时,按照这些规则进行处理。 - **JBPM_ID_GROUP, JBPM_ID_MEMBERSHIP, JBPM_ID_...

    jbpm-7.3.0.Final-bin 工作流

    5. **ejb服务与定时器**:jbpm-services-ejb-timer-7.3.0.Final.jar和jbpm-services-ejb-client-7.3.0.Final.jar提供了基于EJB的定时服务和客户端接口,使得jBPM能够集成到Java EE环境中,实现定时触发流程事件或...

    jbpm帮助文档(中文带源码)

    此外,JPDL还支持其他元素,如sub-process(子流程)、event(事件)和timer(定时器)等,它们为构建复杂流程提供了灵活性。 四、进阶应用 随着对JPDL的深入理解,开发者可以利用JBPM提供的API和工具进行更复杂的...

    Jbpm 编程指南

    - **Timer 定时器** - **持续时间表达式**:用于定义任务或活动持续的时间长度。 - **工作日历**:指定哪些日子可以视为工作日,从而影响定时任务的执行。 - **定时器流向**:控制定时器触发后流程的走向。 - **...

    jbpm数据库脚本

    7. **Job and Timer Tables**(作业和定时器表):用于调度和管理异步任务和定时触发的流程事件。 使用这些脚本时,开发者通常会根据自己的数据库环境(如MySQL、Oracle、PostgreSQL等)进行适当的调整,确保兼容性...

Global site tag (gtag.js) - Google Analytics