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

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

    JBPM4 java源代码分包详解JBPM4

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

    JBPM4 每张表对应的含义

    `JBPM4_PROPERTY`表用于存储系统级别的配置信息,如Hibernate设置等。这些信息对于系统的正常运行至关重要。 ### 总结 JBPM4通过精心设计的数据库结构来支持其复杂的业务流程管理功能。以上提到的每个表都有其独特...

    JBPM4的17张表说明.docx

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

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

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

    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 4.4 开发指南pdf版

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

    JBPM数据库表说明.doc

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

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

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

    Jbpm 编程指南

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

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

Global site tag (gtag.js) - Google Analytics