`
Kevin12
  • 浏览: 234805 次
  • 性别: 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 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 常用表结构及其说明

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

    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工作流应用开始指南.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工作流开发指南

    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数据库表说明.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数据库脚本

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

    JBPM4.3编程指南

    - **Timer定时器** - **持续时间表达式**:定义定时器触发的周期或条件,支持复杂的表达式设置。 - **工作日历**:用于指定定时器工作的日期范围,有助于避免非工作日的误触发。 - **定时器流向**:定义定时器...

Global site tag (gtag.js) - Google Analytics