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

jbpm4 timer 定时器配置

阅读更多
jbpm的定时器支持嵌入到状态节点(State),任务节点(Task),子流程(Sub-process),组(Group),流转线(Transition),自定义节点(Custom)等元素中,下面是我近段时间做限时审批流程时对jbpm的一些理解和用法做一下记录。
当进入配置定时器元素时,定时器被创建,当流程一直处于这个活动时候,定时器可以触发,直到到到截止时间(duedate),当流程离开活动,定时器就会被取消。
timer的属性:

持续时间表达式包含下列语法:
[<Base Date> {+|-}] quantity [business] {second | seconds | minute | minutes | hour | hours | day | days | week | weeks | month | months | year | years}
这里的 Base Date 是一个 EL。 quantity 是一个正整数。  添加额外的 business 意味着 只有工作时间应该被计算在持续时间内。 如果没有指定 business,持续时间会使用绝对时间间隔。注意:'business'还不支持对 base date 进行减法运算!
下面是一些jbpm开发文档中的简单的例子:
下面的例子用法都是可行的
<timer  name="daysBeforeHoliday" duedate="5 business days">...</timer>
<timer  name="pensionDate" duedate="#{dateOfBirth} + 65 years" >...</timer>
<timer  name="pensionReminder" duedate="#{dateOfPension} - 1 year" >...</timer>
<timer  name="fireWorks" duedate="#{chineseNewYear} repeat="1  year" >...</timer>
<reminder name="hitBoss" duedate="#{payRaiseDay} + 3 days" repeat="1 week" />
<reminder name="hitBoss" duedate="#{payRaiseDay} + 3 days" repeat="#{iritationFactor}" 
/>
但是,下面的例子,在'business'的结合运算中使用减法,是不被支持的,会抛出一个异常,会导致持续时间变成一个过去的事件。
<reminder name="toGoOrNotToGo" duedate="#{goLive} - 3 business days"/>

要想定时器起作用,必须修改jbpm.cfg.xml文件,将预先注释掉的<import resource="jbpm.jobexecutor.cfg.xml" />去掉注释。

jbpm4.x中带的jbpm.jobexecutor.cfg.xml的内容是没有详细配置的,但是,它会执行默认的配置。
原始的配置文件内容是:
<?xml version="1.0" encoding="UTF-8"?>

<jbpm-configuration>

  <process-engine-context>
  
  </process-engine-context>

</jbpm-configuration>

可以对该配置文件进行详细的配置,修改后的内容:
<?xml version="1.0" encoding="UTF-8"?>

<jbpm-configuration>

  <process-engine-context>
  
    <job-executor threads="4" idle="30000" idle-max="60000" lock="3600000" />

  </process-engine-context>

</jbpm-configuration>

对配置中的参数讲解:
启用 jobExecutor 是非常简单的,只要添加下面的几行代码 到 jbpm.cfg.xml 文件中(使用默认配置):<import resource="jbpm.jobexecutor.cfg.xml" />还有更多属性,可以更好的调整 JobExecutor: 
·  threads:   定义了 JobexecutorThreadsd 的数目(默认3 个线程)  
·  idle:   以毫秒为单位的,派发器组件  在数据库中找不到新 job 时的等待时间(默认 5 秒)  
·  idle-max:  当出现一个异常时  空闲间隔会翻倍,直到达到'idle-max  (回退机制用来避免从一个错误的数
据库一直读取数据)。  
·  lock-millis:   以毫秒为单位,  一个job 会被锁定,在派发器读取之后。  这可以预防多个 JobExecutorThreads
访问一条记录,会出现死锁。  (比如,在集群中使用)。

下面记录一下定时器在不同元素中的用法:
1.定时器流向,在Transition中配置定时器:
<?xml version="1.0" encoding="UTF-8"?>

<process name="TimerTransitionTest" xmlns="http://jbpm.org/4.4/jpdl">
	<start g="19,50,48,48">
		<transition to="guardedWait" />
	</start>
	<state g="98,46,127,52" name="guardedWait">
		<transition name="timeout" to="escalation" g="-49,-22">
			<timer duedate="10 minutes" />
		</transition>
		<transition g="-16,-17" name="go on" to="next step" />
	</state>
	<state g="287,52,83,53" name="next step" />
	<state name="escalation" g="122,174,80,40" />
</process>

测试类TestTimer.java
package com.lujinyong.timer.transition;

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 TestTimer {
	/**
	 * 
	 * @Description: 部署流程
	 * @Auther: lujinyong
	 * @Date: 2013-6-24 下午03:41:01
	 */
	@Test
	public void testDeploy1() {
		// 1.get processEngine
		ProcessEngine processEngine = Configuration.getProcessEngine();
		processEngine
				.getRepositoryService()
				.createDeployment()
				.addResourceFromClasspath(
						"com/lujinyong/timer/transition/TimerTransitionTest.jpdl.xml")
				.addResourceFromClasspath(
						"com/lujinyong/timer/transition/TimerTransitionTest.png").deploy();
	}
	
	/**
	 * 
	 * @Description: 测试超时的情况,流向escalation
	 * @Auther: lujinyong
	 * @Date: 2013-6-24 下午05:38:35
	 */
	@Test
	public void testTimerTransitionTimerFires() {
		ProcessEngine processEngine = Configuration.getProcessEngine();
		ExecutionService executionService = processEngine.getExecutionService();
		ManagementService managementService = processEngine.getManagementService();
	    ProcessInstance processInstance = executionService.startProcessInstanceByKey("TimerTransitionTest");
	    //查询定时器
	    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"));
	  }
	/**
	 * 
	 * @Description: 测试未超时的情况,流向next step
	 * @Auther: lujinyong
	 * @Date: 2013-6-24 下午05:39:45
	 */
	@Test
	public void testTimerTransitionContinueBeforeTimerFires() {
		ProcessEngine processEngine = Configuration.getProcessEngine();
		ExecutionService executionService = processEngine.getExecutionService();
		ManagementService managementService = processEngine.getManagementService();
	    ProcessInstance processInstance = executionService.startProcessInstanceByKey("TimerTransitionTest");
	    
	    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));
	  }
}

如果创建一个项目,配置好数据库,则可以从数据库记录中看到详细的执行结果。下面就介绍一下配置jbpm的数据库:
首先在eclipse安装好jbpm的插件,我用的是jbpm4.4的,注意安装插件要在断网情况下安装,否则安装很慢。
创建一个web工程,将jbpm-4.4\lib下面的jar包放到项目中的lib目录下面。注意去掉report-engine.zip,gwt-console-jbpm.war,gwt-console-server-jbpm.war。
将配置文件放到src下面:配置文件是jbpm-4.4\examples\src下面的所有配置文件。
jbpm.hibernate.cfg.xml中配置数据库:
<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
  <session-factory>
  
     <property name="hibernate.connection.url">
		jdbc:mysql://127.0.0.1:3306/jbpm4?characterEcoding/=utf-8
	</property>
	<property name="hibernate.connection.driver_class">
		com.mysql.jdbc.Driver
	</property>
	<property name="hibernate.connection.username">root</property>
	<property name="hibernate.connection.password">root</property>

	<property name="hibernate.dialect">
		org.hibernate.dialect.MySQLInnoDBDialect
	</property>
	<property name="hibernate.hbm2ddl.auto">update</property>
	
	<property name="hibernate.show_sql">true</property>
     
     <mapping resource="jbpm.repository.hbm.xml" />
     <mapping resource="jbpm.execution.hbm.xml" />
     <mapping resource="jbpm.history.hbm.xml" />
     <mapping resource="jbpm.task.hbm.xml" />
     <mapping resource="jbpm.identity.hbm.xml" />
     
  </session-factory>
</hibernate-configuration>

在src中一个包com.lujinyong.initdb,在该包中添加创建数据库的类CreateDB.java
package com.lujinyong.initdb;

import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class CreateDB {
	@Test
	public void test(){
		Configuration configuration = new Configuration();
		configuration.configure("jbpm.hibernate.cfg.xml");
		configuration.buildSessionFactory();
	}
}

运行test()即可生成jbpm对应的数据库了。
暂时列出一个例子吧。
  • 大小: 38.2 KB
分享到:
评论

相关推荐

    JBPM4 java源代码分包详解JBPM4

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

    JBPM4 常用表结构及其说明

    - **作用**: 保存JBPM引擎的一些配置属性。 - **主要内容**: 如版本号、默认超时时间等系统级设置。 ##### 5. **JBPM4_TASK** — 任务表 - **作用**: 记录待办任务信息。 - **主要内容**: 任务ID、名称、负责人、...

    JBPM4 每张表对应的含义

    `JBPM4_PROPERTY`表用于存储系统级别的配置信息,如Hibernate设置等。这些信息对于系统的正常运行至关重要。 ### 总结 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数据库表说明.doc

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

    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数据库表关系

    - **JBPM_TIMER**: 计时器,定义了流程中的定时事件。 - **JBPM_TOKEN, JBPM_TOKENVARIABLEMAP**: 令牌表示流程执行的状态,变量映射则关联了令牌与变量。 - **JBPM_TRANSITION**: 转换表,定义了流程中节点间的...

    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 工作流引擎

    - **流程建模语言**:jBPM 提供了一套直观的流程建模语言,能够以图形化的方式表示业务流程,包括但不限于任务(task)、异步通信的等待状态(wait state)、定时器(timer)以及自动化动作(automated action)等元素。...

    JBPM4.3编程指南

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

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

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

Global site tag (gtag.js) - Google Analytics