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));
// }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值