当前位置:首页 > jBPM用户指南 - 图文
每一个命名的对象可以用属性siglenton=\来标记为单态。那意味着一个给定的对象工厂对于每一个请求将总是返回同一个对象。注意,单台在两个不同的对象工厂中不被共享。 单态的特征带来了getObject和getNewObject方法的区别。典型的对象工厂用户将使用getNewObject.这意味着第首先对象工厂的对象缓存在一个新的对象图构造之前被清空,存储在对象工厂缓存的非单态对象允许被一个对象共享引用。单态对象缓存不同于普通的对象缓存。单台缓存从不被清空,而普通对象缓存在每一个getNewObject方法启动时被清空。 第七章 持久化 Persistence
在大多数场合,jBPM用来在一段很长的时间内维持流程的执行。在这个上下文中,“一段很长的时间”意思是跨越很多个事务。持久化的主要意图是在等待状态下存储流程执行。因此我们把流程执行想像成一个状态机。在一个事务中,我们要把流程执行状态机从一个状态移动到下一个状态。
一个流程定义可以被表述成3种形式:作为XML,作为一个java对象和作为jBPM数据库中的一条记录。可执行(运行时)的信息和日志信息可以被表述成两种形式:作为一个java对象和作为jBPM数据库的一条记录。
图 7.1. The transformations and different forms
更多关于流程定义和流程归档的XML表示形式,请看第16章jBPM Process Definition Language (JPDL)。
更多关于如何部署一个流程归档到一个数据库的信息,请看16.1.1节,“部署一个流程归档”。 7.1. 持久化 API
7.1.1. 配置框架的相互关系
持久化API是和配置框架暴露在JbpmContext之外的一些简单易用的方法的一个集成。因此持久化API操作能够在一个jBPM上下文块内被调用,如下:
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try {
// Invoke persistence operations here } finally {
jbpmContext.close(); }
在下文中,我们假设配置包含一个和这个例子(配置文件src/config.files/jbpm.cfg.xml)相似的持久化服务。
...
7.1.2. JbpmContext的易用的方法 3中最为常见的持久化操作是: 部署一个流程 启动一个流程的执行 继续一个执行
首先部署一个流程定义。典型地,这一步将在一个流程图形设计器或用部署流程的ant任务直接完成。但这里你可以看到如何用编程的方式完成:
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try {
ProcessDefinition processDefinition = ...;
jbpmContext.deployProcessDefinition(processDefinition); } finally {
jbpmContext.close(); }
为了创建一个流程执行,我们需要指定这个被实例化的执行是属于哪个流程定义。指定这个最为通用的方法是引用流程的名字且让jBPM在数据库中找到流程的最新版本: JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try {
String processName = ...;
ProcessInstance processInstance =
jbpmContext.newProcessInstance(processName); } finally {
jbpmContext.close(); }
为了继续一个流程执行,我们需要从数据库获取流程实例、令牌或任务实例,在POJO jBPM对象调用一些方法,然后再次保存对流程实例所作的更新到数据库中。 JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try {
long processInstanceId = ...; ProcessInstance processInstance =
jbpmContext.loadProcessInstance(processInstanceId);
name='persistence' factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' /> processInstance.signal(); jbpmContext.save(processInstance); } finally { jbpmContext.close(); } 注意,如果你在JbpmContext使用xxxForUpdate方法,明确的jbpmContext.save方式将不再需要,因为在关闭jbpmContext期间这一步将自动发生。例如:假设我们想要告知jBPM我们已经完成一个任务实例。需要注意的是,任务实例完成将触发执行继续,因此关联到任务实例的流程实例必须保存。要完成这种需求的最为方便的做法是使用loadTaskInstanceForUpdate方法: JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { long taskInstanceId = ...; TaskInstance taskInstance = jbpmContext.loadTaskInstanceForUpdate(taskInstanceId); taskInstance.end(); } finally { jbpmContext.close(); } 下面一部分是关于jBPM如何管理持久化和使用Hibernate的一个说明,只作为一个背景知识。 JbpmConfiguration维护了一个ServiceFactorys的集合。服务工厂在前面说说的jbpm.cfg.xml配置,并以lazy的方式实例化。 DbPersistenceServiceFactory只有在第一次需要的时候实例化。实例化以后,服务工厂在JbpmConfiguration维护。DbPersistenceServiceFactory管理一个hibernate SessionFactory。但同样的,hibernate session factory当在第一次请求的时候以lazy的方式创建。 Figure 7.2. The persistence related classes 在调用jbpmConfiguration.createJbpmContext()的过程中,只有JbpmContext被创建。那时没有更多持久化相关的初始化操作。JbpmContext管理一个DbPersistenceService,DbPersistenceService是在第一次请求时实例化的。DbPersistenceService管理一个hibernate会话。同样的,一个DbPersistenceService之内的hibernate会话以lazy方式创建。因而,一个hibernate会话将只有在第一个请求持久化的操作被调用的时候打开。 7.1.3. 高级 API 用法 DbPersistenceService维护一个lazy初始化的hibernate会话。所有的数据库访问通过这个hibernate会话来完成。所有由jBPM完成的查询和更新是通过XxxSession形式的类来表现,比如GraphSession,SchedulerSession,LoggingSession,...这些会话类与hibernate查询有关,且底层全部使用相同的hibernate会话。 XxxSession类也是通过JbpmContext才可以访问的。 7.2. 配置持久化服务 7.2.1. Hibernate 会话工厂 默认情况下,DbPersistenceServiceFactory将使用ClassPath根目录下的hibernate.cfg.xml资 源文件来创建hibernate会话工厂。需要注意的是hibernate配置文件资源和'jbom.hibernate.cfg.xml'属性相映射,且可以在jbpm.cfg.xml中被定制。以下是默认的配置: ... 当resouce.hibernate.properties属性被指定,这些在那个资源文件中的properties将覆盖在hibernate.cfg.xml文件中的所有properties。hibernate.properties可以被用来处理jbpm方便升级:(hibernate.cfg.xml可以被拷贝而不必重新应用改变),而不是使用修改hibernate.cfg.xml的方式来指向你的数据库。 7.2.2. DbPersistenceServiceFactory DbPersistenceServiceFactory本身有另外三个配置properties:isTransactionEnabled,sessionFactoryJndiName,dataSourceJndiName。想要在jbpm.cfg.xml中指定这些properties,你需要在factory元素中将服务工厂指定为一个bean。就如:
isTransactionEnabled: 默认情况下,jBPM将会开始和结束hibernate事务。为了禁用事务和阻止jPBM用hibernate管理事务,可以在上述的例子中将isTransactionEnabled配置为false。更多关于事务的信息,请看7.3节,“Hibernate事务”。
sessionFactoryJndiName: 默认情况下,这个值为null,意为会话工厂不是从JNDI获取的。如果这个值被设置,且需要会话工厂来创建一个hibernate会话,那么会话工厂将会使用提供的JNDI名称来被获取。
dataSourceJndiName: 默认情况下,这个值为null,且创建JDBC连接的工作将委托给
共分享92篇相关文档