小结

来源:互联网 发布:弗洛伊德算法matlab 编辑:程序博客网 时间:2024/04/19 13:13
一。前言:
在JBPM中,有很多API是供JBPM自身调用的,如流程定义文件中支持的Expression语言,脚本等(org.jbpm.jpdl.el.impl),我们不用理会。

我们主要和下面三类API打交道:
JBPM环境的配置、service的管理、流程的部署和卸载:它主要体现在org.jbpm中,另外辅助包有org.jbpm.jpdl.xml、org.jbpm.configuration。
org.jbpm.configuration负责services对象的创建,相当于一个微型的IoC容器、对象工厂,负责services的生命周期管理,如加载、创建、调用和销毁,像Job调度服务、数据库持久化服务、异步消息服务等。需要说明的是,由于其package下的ObjectFactoryImpl也是一个IoC容器,和Spring的IoC容器是有相同的职责:对象的管理。所以在这种松耦合架构下,可以将JBPM和Spring集成,如业务系统和JBPM引擎的事务处理、对象管理、配置管理等。请参考Spring-Module开源项目。

org.jbpm.jpdl.xml负责流程定义文件的解析,譬如XML文件的解析,相关领域对象的实例化。通过hack其源码和原理,我们可以在业务系统中自定义流程,让用户可以自己定义、变更流程。

JBPM中领域对象:如Node、Token、ProcessInstance、TaskInstance等,它们有三个职责,一个是保持从DB中加载流程和任务相关的数据或将数据持久化到DB。第二,为各领域对象建立关联,方便实现透明持久化(复杂的领域关联在Hibernate的mapping文件里配置)。第三,就是处理业务规则,如引擎调度算法,但不负责持久化。

JBPM中持久化领域对象的Manager,DAO:如TaskMgmtSession。它们主要是持久化领域对象,如session.save(ProcessInstance);或是执行查询,如根据流程ID查询该流程实例,查询操作都是配置在hibernate mapping中的hql语句,如hibernate.queries.hbm.xml。但可能并不能满足我们的要求,譬如按时间段查询当前的流程实例,任务的分页查询,这样,就需要我们自己扩展这些DAO类。由于它们查询是只读操作,所以很容易,而且扩展几乎是必然了,因为要是按JBPM默认的,把所有的Result查询出来,再过滤,性能是个很大的问题,我们应该按需查询。

二。按功能分类说明
JBPM流程的部署和卸载
JBPM流程的部署和卸载,无论是通过管理控制台还是自定义部署,最终都是通过JbpmContext的 deployProcessDefinition(ProcessDefinition)部署,而ProcessDefintion实例的创建,是通过调用ProcessDefinition的相关方法,如parseXmlResource (String xml)。

ProcessDefintion实例的创建,有多种输入源,譬如XML字符串、XML文件、zip包,还有最抽象的Reader、InputStream。如果在用户的业务系统里面自定义发布业务流程,也最终是调用ProcessDefinition相关方法。但流程定义解析,最核心的只有一个类:org.jbpm.jpdl.xml包下的JpdlXmlReader,

org.jbpm.JbpmContext:该类可以理解为Façade模式的实现,与流程相关的manager类可以通过它取得,如getGraphSession()、getServices(),它是获取其它服务的快捷方式,也算是一个delegate类。如果大家对Context的概念比较敏感,其类职责就很好理解,在Servlet容器里面也有ServletContext的概念,和它意思差不多。对一般的系统软件一般来说,Context往往建模成Container的上下文。在JBPM中,它还负责流程部署、加载、卸载。

3.附带说明:
JBPM的任务管理
JBPM和任务管理相关的类主要是org.jbpm.taskmgmt.def和org.jbpm.taskmgmt.exe,像任务创建、分配等。
和任务相关的最重要的有两个方面,一个是任务分配,另一个是和任务相关的表单。当然,任务查询和任务日志也很重要。

任务分配:解决的是将任务分配给谁,它有静态分配和动态分配两种,前者是在流程定义文件里部署,后者是通过代码动态指定。它涉及到的概念有Actor,PooledActor,Swimlane,AssignmentHandler。在做demo时,譬如JBPM官方自带的例子webSale里,就是通过Expression静态部署任务角色的,如user(leo),group(orderManager),但它用到了JBPM的第三方组件Identity,其实通过Expression静态分配角色,本质上也是通过AssignmentHandler实现的,如ExpressionAssignmentHandler。
任务分配,一般比较灵活的方案是在流程的Swimlane里面部署自定义action,然后重用swimlane。另外一种方案是,在每个task里面部署AssignmentHandler实现类。

任务相关表单:主要是org.jbpm.taskmgmt.def.TaskController,它是task scope下的表单字段,类似Servlet里面的HttpServletRequest的setAttribute()。如果是process scope下的表单项,是org.jbpm.context.exe.ContextInstance,类似于Servlet里面的HttpSession的setAttribute()。

附带说一下任务查询,所有有关查询和持久化的操作,都集中在包org.jbpm.db中,如任务相关的TaskMgmtSession,要是这些find方法不满足业务要求,建议自己扩展。

JBPM的流程日志
JBPM的流程日志,主要是记录一些事件(Event),如流程创建、任务分配,它们在GraphElement的fireEvent时,譬如在Node.leave()(Token离开当前节点时)触发fireEvent事件(在该事件方法里执行自定义Action),同时记录日志。我们关心的日志主要有process、task、transition、signal四类,每个下面还有事件细分,如task创建和分配。通过日志,我们统计流程执行效率,也可以得到详细的流程步骤日志。

日志的查询,请参考LoggingSession及其相关类。顺便说一下,所有的日志类都继承于ProcessLog,约20来个。JBPM已经声明的日志查询方法,可能并不能满足我们的要求,自行扩展吧。
原创粉丝点击