- 浏览: 215610 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
strong8808:
activemq5.8.0 客户端,服务端启动序列图 -
xurichusheng:
第一题,如果使用 not exists 的话,可以改成:SEL ...
SQL笔试题 -
dingjun1:
cuisuqiang 写道如何解决呢?我的是对了也照样缓存增加 ...
事务未正确关闭引起的HIBERNATE SESSION不能正确关闭 -
dingjun1:
aijezdm915 写道lz ,我也是在写项目描述是犯愁,能 ...
如果在简历中描述项目 -
aijezdm915:
lz ,我也是在写项目描述是犯愁,能否给个你的简历demo,我 ...
如果在简历中描述项目
转载: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
可以看到,引擎把xml中timer节点解析成了两个ACTION:CreateTimerAction和CancelTimerAction
CreateTimerAction会在进入该节点时触发,而CancelTimerAction会在令牌离开该节点时触发。
2、看看CreateTimerAction和CancelTimerAction究竟在做些什么
CreateTimerAction.java
很明显,是通过一个职责集中的schedulerService向job表中插入了一条job记录,注意到这个方法:
这里利用JBPM提供的工作时间计算组件计算了job的执行时间。
CancelTimerAction就很简单了,删除相应的job记录。
CancelTimerAction.java
3、JobExecutorServlet是干什么的
启动线程
5、着重关注Time对象
在上面我们看到实际执行的代码是job.execute(jbpmContext);
Time 是Job的子类,看看它的实现:
整体来说实现的非常清晰:
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; }
发表评论
-
solr/home 设置
2013-04-21 00:44 1263solr/home是solr实例化core核的依据和入口,是必 ... -
CronTrigger Tutorial
2011-02-24 18:58 932转载地址:http://www.quartz-schedule ... -
事务未正确关闭引起的HIBERNATE SESSION不能正确关闭
2010-10-30 13:46 1681问题现象: 第一 ... -
hibernate 四种抓取策略
2010-10-24 10:42 944转载:http://www.cnblogs.com ... -
cas分析
2010-05-10 13:20 1993Central Authentication Service ... -
FCKeditor2.6.5及后续版本 for PHP配置及中文上传乱码解决!
2009-12-10 13:37 1429对于Fckeditor上传中文名文件时显示乱码的问题,现公布方 ... -
xpath语法
2009-10-12 21:02 947转载:http://www.w3schools.com/XPa ... -
jstl标签中循环map
2009-10-12 20:58 2601<% Map map = new HashMap(); ... -
log4j输出多个自定义日志文件(分离日志)
2009-06-24 11:30 2615转载: http://wangjc-opal.iteye.co ... -
错误: 必须限制口令文件读取访问
2008-10-10 17:06 3101转载:http://hi.baidu.com/lifecodi ... -
spring AOP使用结总结
2008-09-12 14:23 1124AOP使用结总结 最近需要 ... -
log4j手动加载配置文件
2008-09-10 15:26 3195PropertyConfigurator.configur ... -
spring集成hibernate使用缓存简单实例
2008-07-08 18:20 2387这部分为转载:http://www ... -
lucene应用入门1
2008-07-06 16:49 2169简单的建立索引和索引 ... -
多对多查询的条件设置和删除问题
2008-07-03 14:50 1518select 父 from 父类 父 left join 父. ... -
DOM4J学习笔记
2008-07-01 15:07 3734DOM4J简单介绍 基本使用 读取XML文档 Import o ... -
延迟初始化错误(转载)
2008-06-12 17:52 1020转载地址:http://lz726.ite ... -
UUID [转帖]
2008-05-20 15:25 947/***********本人原创,欢迎转载,转载请保留本人信息 ... -
一段简单的发送邮件代码
2008-04-28 15:57 1053package send; import java. ... -
重新学习 Hibernate fetch lazy cascade inverse[转载]
2008-04-21 11:55 1250转载:http://www.blogjava.ne ...
相关推荐
7. **设计和实现监控服务**:创建一个独立的服务,该服务定期轮询JBPM服务器获取流程信息,并根据获取的数据进行分析和展示,这样可以实现更灵活的监控策略。 总的来说,虽然JBPM自身未提供内置的流程监控功能,但...
【jbpm4.3 会签的实现】 在企业级工作流管理系统中,会签(Concurrence Signature)是一种常见的审批流程模式,它允许多个审批人同时参与同一个任务的处理,只有当所有指定的审批人都完成他们的操作后,任务才会被...
jbpm是一个开源的工作流管理系统,用于帮助开发者实现业务流程自动化。以下是基于给定文件的信息,深入解析jbpm4和jbpm5的知识点: 1. **jbpm4表结构和表字段说明**: jbpm4.3表结构和表字段说明文档通常会详细...
### JBPM流程监控的实现过程详解 JBPM作为一款由JBOSS公司推出的开源工作流管理工具,以其强大的功能和灵活性赢得了众多开发者的青睐。尽管如此,JBPM原生并未直接提供流程监控功能的API,这无疑给那些希望在企业...
7. **基于订阅的技术支持**:用户可以根据需要选择技术支持服务,从而获得来自源码开发者的直接帮助和支持。 8. **JavaEE标准接口支持**:jBPM预留了WebService、JCA、JMS等JavaEE标准接口,使得与其他JavaEE程序的...
通过查看JBPM的表,我们知道要实现流程监控功能就是把JBPM当中的JBPM_PROCESSDEFINITION(已发布的流程表),JBPM_PROCESSINSTANCE(流程实例表),JBPM_TASKINSTANCE(流程产生的任务实例表)这三张表串联起来就可以...
BPM 是一种管理既定工作的流程,通过服务编排,统一调控各个业务流程,以确保在正确的时间被正确的人执行,达到优化整体业务过程的目的。BPM 通过建模,自动化管理和优化流程,打破跨部门系统业务过程依赖,提高业务...
jbpm jbpm4.3.jar DDDDDDDD
此外,熟悉Drools规则引擎的使用,能帮助开发者更好地利用jBpm实现智能决策。 总之,jBpm 3.1.2是业务流程自动化领域的一个强大工具,它为开发高效、灵活的工作流应用提供了坚实的基础。无论是对于企业内部的流程...
### jbpm4服务接口方法汇总 #### Process Engine与Service组件概览 在JBPM框架中,`ProcessEngine`是核心的工厂类,负责提供一系列的服务接口。这些接口为流程管理和控制提供了必要的支持。通过初始化`...
jBPM 通过提供一个强大的执行引擎、一套丰富的服务组件和一套完善的工具链,使得开发者能够更加便捷地设计、实现和监控业务流程。 #### 三、jBPM 的三大核心组件 1. **执行引擎**:这是 jBPM 的核心部分,负责解析...
jbpm使用案例,非常不错,大家都来看看吧。
4. **服务整合**:jbPM可以通过服务调用节点集成外部系统,如Web服务、EJB等。 5. **规则引擎集成**:jbPM集成了Drools规则引擎,可以在流程中嵌入业务规则,实现规则驱动的业务流程。 6. **事务管理**:jbPM支持...
这样的结合可以让企业流程更加灵活,便于业务规则的修改和扩展,同时也简化了前端与后端服务的交互。 在标签中提到了"源码"和"工具",这表明该压缩包可能包含jbpm和Struts2整合的示例代码或者开发工具。源码通常是...
描述用eclipse部署JBPM服务,以及用xfire将JBPM服务发布成webservice。一、下载JBPM包并解压。。。。
【JBPM_(3)_Impl.ppt】主要讲解jbpm的实现细节,包括工作流引擎的内部工作机制、任务服务的使用、监听器和工作流审计。这部分内容有助于开发者深入理解jbpm的工作原理,提升你在开发过程中对性能优化和问题排查的...
你可以利用这些API创建和执行流程,同时结合JPA、Hibernate等技术实现持久化。 8. **测试与调试**:通过编写JUnit测试用例,可以对流程逻辑进行单元测试。此外,JBPM4.4提供的日志和审计功能也方便你在开发过程中...
5. **服务和事件**:jbpm4支持服务调用和服务激活,允许在流程中嵌入外部系统的服务。同时,它还提供了事件处理机制,可以对特定事件做出响应。 6. **监控和管理**:jbpm4提供了管理控制台,用于监控流程实例的运行...
8. **集成能力**:jbpm能够与其他Java应用程序、服务和数据库无缝集成,提供了丰富的API和工具,便于开发人员将工作流集成到现有系统中。 9. **监控与调试**:jbpm提供了图形化的监控工具,允许管理员查看流程实例...
### jBPM4的PVM实现解析 #### 一、PVM概述 PVM(流程虚拟机)是jBPM4中的核心概念之一,它提供了一个抽象层来处理流程定义和执行逻辑。PVM的设计目的是为了使流程引擎更加灵活、可扩展,并能够支持多种流程语言。...