JBPM 流程监控的实现

asd_1948 贡献于2012-02-16

作者 gaojie  创建于2007-08-05 13:40:00   修改者TD  修改于2007-08-20 16:39:00字数5377

文档摘要:JBPM是JBOSS公司的一个开源工作流产品,它功能强大,商业工作流所提供的功能它基本上都有。然而在JBPM中没有提供流程监控的功能的相关API,这点让很多使用JBPM做企业应用的开发人员颇为头疼。 其实,在JBPM中我们可以通过手工编码的方式来实现商业工作流中所具有的流程监控功能。
关键词:

 JBPM流程监控的实现 v1.01 JBPM流程监控的实现 JBPM是JBOSS公司的一个开源工作流产品,它功能强大,商业工作流所提供的功能它基本上都有。然而在JBPM中没有提供流程监控的功能的相关API,这点让很多使用JBPM做企业应用的开发人员颇为头疼。 其实,在JBPM中我们可以通过手工编码的方式来实现商业工作流中所具有的流程监控功能。 所谓的流程监控就是要实现可以看到当前系统中发布了多少个流程;每一个流程产生了多少个流程实例,有哪些流程实例结束了,哪些处于活动状态,哪些挂起了;同时对于每一个流程实例当前走到什么位置了(流程的进度状况)等等。通过查看JBPM的API我们发现API里并没有提供实现该功能现成的接口,不过我们可以通过自己手工编码的方式来拿到我们需要的监控信息。 通过查看JBPM的表,我们知道要实现流程监控功能就是把JBPM当中的JBPM_PROCESSDEFINITION(已发布的流程表),JBPM_PROCESSINSTANCE(流程实例表),JBPM_TASKINSTANCE(流程产生的任务实例表)这三张表串联起来就可以实现我们所要的监控功能。 首先我们要拿到所有的已发布的流程表的最后一个版本的信息,关于这一块我们可以通过JbpmContext来实现: JbpmConfiguration config = JbpmConfiguration.getInstance(); JbpmContext jbpm=config.createJbpmContext(); try { List ls=jbpm.getGraphSession().findLatestProcessDefinitions(); ...... } catch (Exception e) { throw e; }finally{ jbpm.close(); } 上面代码中的List ls=jbpm.getGraphSession().findLatestProcessDefinitions();是JbpmContext提供的拿到所有的最后一个版本的所有的流程定义信息。 拿到所有的最后一个版本的流程定义信息后,接下来我们需要根据每一个流程定义的名称找到它目前有多少个活动的,或不活动的,或挂起的流程实例。在这里我们来实现根据流程定义名称找到所有的处于活动状态下的流程实例。 第页 共9页 JBPM流程监控的实现 v1.01 这一块的功能JBPM的API没有提供现成的,需要我们自己实现。 JBPM的持久层是用Hibernate实现的,因此要实现根据流程定义名称找到所有的处于活动状态下的流程实例我们要写一段HQL来查找所有的由该流程产生的流程实例,然后对得到的流程实例集合进行过滤,拿到我们想要的所有处于活动状态下的流程实例。 查看org.jbpm.db包下面,我们会发现有一个名为:hibernate.queries.hbm.xml文件,它是一个JBPM查询时使用HQL的存储文件,用记事本打开,找到下面的“Query”定义信息: 从名称我们可以看出,这段HQL的作用是用来根据流程ID来查询对应的所有的流程实例,同时按开始时间排倒序。这段HQL只能拿到当前流程的所有实例,并不能区分实例是否处于活动状态,这时我们需要手工区分实例是否是活动的流程实例,所以我们就有下面的代码: JbpmConfiguration config = JbpmConfiguration.getInstance(); JbpmContext jbpm=config.createJbpmContext(); Session session=jbpm.getSessionFactory().openSession(); try { String hql = "from ProcessInstance pi where pi.processDefinition.id='"+processId+"' order by pi.start desc";//这里的processId是应用传过来的流程的ID号 List ls = session.createQuery(hql).list(); for (int i=0;i 上面的这段HQL表示取指定用户的所有未处理的的任务实例。不符合我们的要求,我们需要在这段HQL的基础上加以改造,于是就有了下面的HQL: String hql="from TaskInstance ti left join fetch ti.token where ti.isOpen = true and ti.taskMgmtInstance.processInstance="+processInstanceId+""; 解释一下上面的HQL,“left join fetch ti.token”表示在取任务实例时显式的拿到任务实例所对应Token信息,“ti.taskMgmtInstance.processInstance="+processInstanceId+""”表示取任务实例时加上流程实例的限制,这里的processInstanceId是应用里传过来的流程实例ID。JAVA代码如下: JbpmContext jbpm=this.getJbpmContext(); Session session=jbpm.getSessionFactory().openSession(); try { String hql="from TaskInstance ti left join fetch ti.token where ti.isOpen = true and ti.taskMgmtInstance.processInstance="+processInstanceId+""; List ls=session.createQuery(hql).list(); } catch (Exception e) { throw e; }finally{ session.close(); jbpm.close(); } 好了,到这里我们已经从理论上实现JBPM的流程监控功能。接下来我们可以在实践中演练一下,看看 第页 共9页 JBPM流程监控的实现 v1.01 是否可以实现真正的监控。 这里我们采用的是Bstek公司的Web前端展现产品Dorado5.1(http://www.bstek.com)来做我们的前端展现。加载数据的代码如下: package org.jbpm.monitor; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.hibernate.Session; import org.jbpm.JbpmConfiguration; import org.jbpm.JbpmContext; import org.jbpm.graph.exe.ProcessInstance; import com.bstek.dorado.view.DefaultViewModel; import com.bstek.dorado.view.data.ViewDataset; /** * MonitorView * 该类用来显示某个流程当前激活的流程,每个激活的流程所在节点的位置 */ public class MonitorView extends DefaultViewModel { protected void doLoadData(ViewDataset dataset) throws Exception { String datasetId=dataset.getId(); if(datasetId.equals("datasetProcessDefination")){ JbpmContext jbpm=this.getJbpmContext(); try { List ls=jbpm.getGraphSession().findLatestProcessDefinitions(); dataset.fromDO(ls); } catch (Exception e) { throw e; 第页 共9页 JBPM流程监控的实现 v1.01 }finally{ jbpm.close(); } }else if(datasetId.equals("datasetProcessInstance")){ String processId=dataset.parameters().getString("processId"); List ls=new ArrayList(); if(processId!=null){ JbpmContext jbpm=this.getJbpmContext(); Session session=jbpm.getSessionFactory().openSession(); try { String hql = "from ProcessInstance pi where pi.processDefinition.id='"+processId+"' order by pi.start desc"; ls = session.createQuery(hql).list(); for (int i=0;i

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ] 3 人已下载

下载文档