`
dingjun1
  • 浏览: 211862 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转载]JBPM时间服务的实现

阅读更多
转载:http://blog.esac.cnic.cn/u/Neptune/archives/2007/231.html
整体来说实现的非常清晰:
1、引擎解析流程定义xml时,给相应的事件挂接上create-timer 和 cancel-timer动作
2、流程实例实际运转时,create-timer动作在相应事件触发时执行
3、create-timer在job表里插入相应时间job记录,给该job记录附上计算完毕的执行时间
4、JobExecutorServlet在后台启动一到多个JobExecutorThread线程
5、JobExecutorThread线程不停的每隔一段时间对job表扫描一次,找出需要执行的job记录,执行之
6、只执行一次的job记录,执行完毕后删除之;重复执行的job记录,写入新的执行时间,更新之
7、相应事件触发cancel-timer动作,将对应job记录从job表里删除
下面具体用代码来说话(挂接到node节点):
1、引擎解析流程定义xml
JpdlXmlReader.java
protected void readNodeTimer(Element timerElement, Node node) {
String name = timerElement.attributeValue("name", node.getName());

CreateTimerAction createTimerAction = new CreateTimerAction();
createTimerAction.read(timerElement, this);
createTimerAction.setTimerName(name);
createTimerAction.setTimerAction(readSingleAction(timerElement));
addAction(node, Event.EVENTTYPE_NODE_ENTER, createTimerAction);

CancelTimerAction cancelTimerAction = new CancelTimerAction();
cancelTimerAction.setTimerName(name);
addAction(node, Event.EVENTTYPE_NODE_LEAVE, cancelTimerAction);
}

可以看到,引擎把xml中timer节点解析成了两个ACTION:CreateTimerAction和CancelTimerAction
CreateTimerAction会在进入该节点时触发,而CancelTimerAction会在令牌离开该节点时触发。
2、看看CreateTimerAction和CancelTimerAction究竟在做些什么
CreateTimerAction.java
public void execute(ExecutionContext executionContext) throws Exception {
Timer timer = createTimer(executionContext);
SchedulerService schedulerService = (SchedulerService) Services.getCurrentService(Services.SERVICENAME_SCHEDULER);
schedulerService.createTimer(timer);
}

很明显,是通过一个职责集中的schedulerService向job表中插入了一条job记录,注意到这个方法:
protected Timer createTimer(ExecutionContext executionContext) {
Timer timer = new Timer(executionContext.getToken());
.
if (dueDate!=null) {
Duration duration = new Duration(dueDate);
Date dueDateDate = businessCalendar.add( new Date(), duration );
timer.setDueDate(dueDateDate);
}
.

return timer;
}

这里利用JBPM提供的工作时间计算组件计算了job的执行时间。
CancelTimerAction就很简单了,删除相应的job记录。
CancelTimerAction.java
public void execute(ExecutionContext executionContext) throws Exception {
SchedulerService schedulerService = (SchedulerService) Services.getCurrentService(Services.SERVICENAME_SCHEDULER);
schedulerService.deleteTimersByName(timerName, executionContext.getToken());
}

3、JobExecutorServlet是干什么的
启动线程
public void init() throws ServletException {
.
jbpmConfiguration.startJobExecutor();
}
4、线程是如何工作
public void run() {
try {
currentIdleInterval = idleInterval;
while (isActive) {
try {
Collection acquiredJobs = acquireJobs(); //从job表里获得将要执行的job记录

if (! acquiredJobs.isEmpty()) { //如果记录不为空,则开始执行
Iterator iter = acquiredJobs.iterator();
while (iter.hasNext() && isActive) {
Job job = (Job) iter.next();
executeJob(job); //执行
}

} else { // no jobs acquired //如果没有可执行的job,则等待一段时间
if (isActive) {
long waitPeriod = getWaitPeriod(); //等待的时间是找出即将执行的job离现在最近的时间间隔
if (waitPeriod>0) {
synchronized(jobExecutor) {
jobExecutor.wait(waitPeriod);
}
}
}
}

.
} catch (Throwable t) {
t.printStackTrace();
} finally {
log.info(getName()+" leaves cyberspace");
}
}
//看看实际执行的方法
protected void executeJob(Job job) {
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
JobSession jobSession = jbpmContext.getJobSession();
job = jobSession.loadJob(job.getId());

try {
log.debug("executing job "+job);
if (job.execute(jbpmContext)) { //交由Job对象本身去完成执行的逻辑,并决定是否删除job记录
jobSession.deleteJob(job);
}
.
}

5、着重关注Time对象
在上面我们看到实际执行的代码是job.execute(jbpmContext);
Time 是Job的子类,看看它的实现:
public boolean execute(JbpmContext jbpmContext) throws Exception {
boolean deleteThisJob = true; //执行完毕后是否删除job记录

ExecutionContext executionContext = new ExecutionContext(token);
executionContext.setTimer(this);

if (taskInstance!=null) {
executionContext.setTaskInstance(taskInstance);
}

// 触发timer事件
if (graphElement!=null) {
graphElement.fireAndPropagateEvent(Event.EVENTTYPE_TIMER, executionContext);
}

// 如果timer节点上挂有action则执行之
if (action!=null) {
try {
log.debug("executing timer '"+this+"'");
action.execute(executionContext);
} catch (Exception actionException) {
.
}

// 如果定义了transition属性,则流程顺着定义的路径流转
if ( (transitionName!=null)
&& (exception==null) // and if no unhandled exception occurred during the action
) {
if (token.getNode().hasLeavingTransition(transitionName)) {
token.signal(transitionName);
}
}

// 如果定义了repeat属性则job记录不容许删除,同时计算新的执行时间
if (repeat!=null) {
deleteThisJob = false;

while (dueDate.getTime()<=System.currentTimeMillis()) {
dueDate = businessCalendar
.add(dueDate,
new Duration(repeat));
}
log.debug("updated timer for repetition '"+this+"' in '"+(dueDate.getTime()-System.currentTimeMillis())+"' millis");
}

return deleteThisJob;
}

分享到:
评论

相关推荐

    JBPM 流程 监控 的实现

    7. **设计和实现监控服务**:创建一个独立的服务,该服务定期轮询JBPM服务器获取流程信息,并根据获取的数据进行分析和展示,这样可以实现更灵活的监控策略。 总的来说,虽然JBPM自身未提供内置的流程监控功能,但...

    jbpm4.3 会签的实现

    【jbpm4.3 会签的实现】 在企业级工作流管理系统中,会签(Concurrence Signature)是一种常见的审批流程模式,它允许多个审批人同时参与同一个任务的处理,只有当所有指定的审批人都完成他们的操作后,任务才会被...

    jbpm4jbpm5

    jbpm是一个开源的工作流管理系统,用于帮助开发者实现业务流程自动化。以下是基于给定文件的信息,深入解析jbpm4和jbpm5的知识点: 1. **jbpm4表结构和表字段说明**: jbpm4.3表结构和表字段说明文档通常会详细...

    JBPM流程监控的实现过程

    ### JBPM流程监控的实现过程详解 JBPM作为一款由JBOSS公司推出的开源工作流管理工具,以其强大的功能和灵活性赢得了众多开发者的青睐。尽管如此,JBPM原生并未直接提供流程监控功能的API,这无疑给那些希望在企业...

    jbpm简介\jbpm简介

    7. **基于订阅的技术支持**:用户可以根据需要选择技术支持服务,从而获得来自源码开发者的直接帮助和支持。 8. **JavaEE标准接口支持**:jBPM预留了WebService、JCA、JMS等JavaEE标准接口,使得与其他JavaEE程序的...

    jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍

    - **实现集中统一**:将分散的业务流程代码集中统一管理。 - **加快应用开发速度**:减少关注流程参与者,提升开发速度。 - **简化流程变更**:只需修改商业流程描述文件即可完成流程变更。 2. **高效业务流程...

    jbpm开发指南--jbpm全面介绍

    通过查看JBPM的表,我们知道要实现流程监控功能就是把JBPM当中的JBPM_PROCESSDEFINITION(已发布的流程表),JBPM_PROCESSINSTANCE(流程实例表),JBPM_TASKINSTANCE(流程产生的任务实例表)这三张表串联起来就可以...

    jbpm jbpm4.3.jar

    jbpm jbpm4.3.jar DDDDDDDD

    JBPM7基础开发

    BPM 是一种管理既定工作的流程,通过服务编排,统一调控各个业务流程,以确保在正确的时间被正确的人执行,达到优化整体业务过程的目的。BPM 通过建模,自动化管理和优化流程,打破跨部门系统业务过程依赖,提高业务...

    jbpm-3.1.2.zip_jbpm_jbpm 3.1.2_jbpm-3.1.2.rar_jbpm3.1.2_工作流

    此外,熟悉Drools规则引擎的使用,能帮助开发者更好地利用jBpm实现智能决策。 总之,jBpm 3.1.2是业务流程自动化领域的一个强大工具,它为开发高效、灵活的工作流应用提供了坚实的基础。无论是对于企业内部的流程...

    jbpm4服务接口方法汇总

    ### jbpm4服务接口方法汇总 #### Process Engine与Service组件概览 在JBPM框架中,`ProcessEngine`是核心的工厂类,负责提供一系列的服务接口。这些接口为流程管理和控制提供了必要的支持。通过初始化`...

    jbpm 数据库jbpm 数据库

    jbpm使用JPA(Java Persistence API)来实现数据库的持久化操作,确保在流程执行过程中数据的一致性和完整性。同时,jbpm支持事务管理,确保在出现错误时能够回滚到之前的状态。 7. **数据库配置** 用户可以根据...

    jbpm白皮书 介绍jbpm 入门

    jBPM 通过提供一个强大的执行引擎、一套丰富的服务组件和一套完善的工具链,使得开发者能够更加便捷地设计、实现和监控业务流程。 #### 三、jBPM 的三大核心组件 1. **执行引擎**:这是 jBPM 的核心部分,负责解析...

    jbpm 案例 jbpm jbpm

    jbpm使用案例,非常不错,大家都来看看吧。

    jBPM3.2.rar_JBPM3.2_jbpm_jbpm 3.2_jbpm3_jbpm3.2教程

    4. **服务整合**:jbPM可以通过服务调用节点集成外部系统,如Web服务、EJB等。 5. **规则引擎集成**:jbPM集成了Drools规则引擎,可以在流程中嵌入业务规则,实现规则驱动的业务流程。 6. **事务管理**:jbPM支持...

    jbpm4源码jbpm4源码jbpm4源码

    通过深入研究jbpm4的源码,可以了解其内部实现原理,学习如何构建高效、灵活的流程管理系统,同时也能提升Java编程、企业服务集成等方面的技术能力。对于想要从事企业级工作流管理开发的工程师来说,理解jbpm4源码是...

    jbpm

    这样的结合可以让企业流程更加灵活,便于业务规则的修改和扩展,同时也简化了前端与后端服务的交互。 在标签中提到了"源码"和"工具",这表明该压缩包可能包含jbpm和Struts2整合的示例代码或者开发工具。源码通常是...

    JBPM服务部署与xfire发布webservice服务

    描述用eclipse部署JBPM服务,以及用xfire将JBPM服务发布成webservice。一、下载JBPM包并解压。。。。

    传智播客jbpm教程

    【JBPM_(3)_Impl.ppt】主要讲解jbpm的实现细节,包括工作流引擎的内部工作机制、任务服务的使用、监听器和工作流审计。这部分内容有助于开发者深入理解jbpm的工作原理,提升你在开发过程中对性能优化和问题排查的...

    JBPM4环境搭建

    你可以利用这些API创建和执行流程,同时结合JPA、Hibernate等技术实现持久化。 8. **测试与调试**:通过编写JUnit测试用例,可以对流程逻辑进行单元测试。此外,JBPM4.4提供的日志和审计功能也方便你在开发过程中...

Global site tag (gtag.js) - Google Analytics