jbpm4.0:jBPM-4.0中文开发指南-第14章 持久化

  第 14 章 持久化

   14.1. 标准环境配置

   这节描述了环境如何配置 来在标准Java环境中使用hibernate.

01 | <jbpm-configuration>
02 |
03 |   <process-engine>
04 |     <hibernate-session-factory />
05 |     <hibernate-configuration>
06 |       <properties resource="hibernate.properties" />
07 |       <mapping resource="jbpm.pvm.typedefs.hbm.xml" />
08 |       <mapping resource="jbpm.pvm.wire.hbm.xml" />
09 |       <mapping resource="jbpm.pvm.definition.hbm.xml" />
10 |       <mapping resource="jbpm.pvm.execution.hbm.xml" />
11 |       <mapping resource="jbpm.pvm.variable.hbm.xml" />
12 |       <mapping resource="jbpm.pvm.job.hbm.xml" />
13 |       <mapping resource="jbpm.jpdl.hbm.xml" />
14 |       <cache-configuration resource="jbpm.pvm.cache.xml"
15 |                           usage="nonstrict-read-write" />
16 |     </hibernate-configuration>
17 |   </process-engine>
18 |
19 |   <transaction-context>
20 |     <standard-transaction />
21 |     <hibernate-session />
22 |     <pvm-db-session />
23 |   </transaction-context>
24 |
25 | </jbpm-configuration>


   line 04在流程引擎环境下指定了个hibernate会话 这意味着hibernate会话工厂会被延迟创建 当它第次需要时 会缓存Cache到EnvironmentFactory中

   个hibernate会话工厂在个hibernate配置中 通过buildSessionFactory()思路方法创建 默认情况下hibernate配置会根据类型进行查找

   line 05指定个hibernate配置

   line 06指定资源文件 hibernate.properties应该被加载到配置中

   line 07 - 13指定映射资源文件

   line 14 - 15提供个单独地方来指定 hibernate缓存Cache策略为所有PVM类和集合

   line 20指定个标准事务 这是个非常简单全局事务策略 没有可以用在标准环境下恢复 会获得所有或没有符合语义多个事务型资源的上

   line 21指定hibernate会话 会自动注册它自己使用标准事务

   line 22指定个PvmDbSession. 那是个类添加了思路方法绑定到特定查询 将在hiberante会话中执行

  14.2. 标准hibernate配置

   这儿是系列默认配置 来在标准Java环境下和hsqldb起配置hibernate.

hibernate.dialect                      org.hibernate.dialect.HSQLDialect
hibernate.connection.driver_      org.hsqldb.jdbcDriver
hibernate.connection.url               jdbc:hsqldb:mem:.
hibernate.connection.username          sa
hibernate.connection.password
hibernate.cache.use_second_level_cache true
hibernate.cache.provider_         org.hibernate.cache.HashtableCacheProvider


   在开发中可以选择数据库结构导出 在会话工厂创建时候创建数据库结构 在会话工厂关闭时候删除数据库结构

  hibernate.hbm2ddl.auto                 create-drop

   为了了解更多有关hibernate配置 可以参考hibernate引用手册

   14.3. 标准事务

   默认情况下<hibernate-session />会使用 session.beginTransaction()启动hibernate事务 然后hibernate事务会封装成个org.jbpm.pvm.ernal.hibernate.HibernateTransactionResource 资源被支持在<standard-transaction /> (org.jbpm.tx.StandardTransaction)

   在环境块内部通过environment.getTransaction() 获得事务所以在环境块内事务可以通过 environment.getTransaction()RollbackOnly() 回滚

   当初创建时标准事务会把自己注册 在环境关闭时会被提醒所以在关闭时 标准事务会提交或回滚 根据是否地RollbackOnly()

   所以在上面配置中每个环境块会拥有独立事务 至少如果使用是hibernate会话

   14.4. 流程例子化基础

   在下个例子中我们将演示hibernate持久化是如何使用在 个具体例子中'persistent process'是个简单 3步流程:

  

   图 14.1. 持久化流程

   3个活动会是等待状态 就像第 5.4 节 “ExternalActivity例子”

   为了确认我们持久化了这个类我们为它创建了hibernate映射 并像这样把它添加到配置文件中:

<hibernate-configuration>
  <properties resource="hibernate.properties" />
  <mapping resource="jbpm.pvm.typedefs.hbm.xml" />
  <mapping resource="jbpm.pvm.wire.hbm.xml" />
  <mapping resource="jbpm.pvm.definition.hbm.xml" />
  <mapping resource="jbpm.pvm.execution.hbm.xml" />
  <mapping resource="jbpm.pvm.variable.hbm.xml" />
  <mapping resource="jbpm.pvm.job.hbm.xml" />
  <mapping resource="jbpm.jpdl.hbm.xml" />
  <mapping resource="org/jbpm/examples/ch09/state.hbm.xml" />
  <cache-configuration resource="jbpm.pvm.cache.xml"
                       usage="nonstrict-read-write" />
</hibernate-configuration>


   下个代码片段演示了个单元测试思路方法内容 这个思路方法首先创建环境工厂然后在第个事务中 个流程定义会被创建 并保存到数据库然后第 2个事务会创建这那个流程个新执行 下面两个事物会向执行提供外部触发器

EnvironmentFactory environmentFactory = EnvironmentFactory.parse( ResourceStreamSource(
    "org/jbpm/examples/ch09/environment.cfg.xml"
));


   然后在第个事务中个流程被创建了并保存到数据库中 这是个通常引用像是发布个流程 它只需要执行

Environment environment = environmentFactory.openEnvironment;
try {
  PvmDbSession pvmDbSession = environment.get(PvmDbSession.);

  ProcessDefinition processDefinition = ProcessFactory.build("persisted process")
    .activity("one").initial.behaviour( State)
      .transition.to("two")
    .activity("two").behaviour( State)
      .transition.to("three")
    .activity("three").behaviour( State)
  .done;

  pvmDbSession.save(processDefinition);
} finally {
  environment.close;
}


   在前个事务中流程定义活动转移 会被插入到数据库表中

   接下来我们演示个流程定义新流程执行是如何启动 注意在这个情况下我们提供了个业务键 叫做'first'.这会让我们更简单处理相同执行 从数据库事务中在启动新流程执行后 它会等待'one'活动 行为是个等待状态

environment = environmentFactory.openEnvironment;
try {
  PvmDbSession pvmDbSession = environment.get(PvmDbSession.);

  ProcessDefinition processDefinition = pvmDbSession.findProcessDefinition("persisted process");
  assertNotNull(processDefinition);

  Execution execution = processDefinition.startExecution("first");
  assertEquals("one", execution.getActivity.getName);
  pvmDbSession.save(execution);

} finally {
  environment.close;
}


   在上个事务中个新执行记录会被插入到 数据库中

   下我们反馈个外部触发器到这个存在流程执行中 我们读取执行提供个signal然后只是把它保存回数据库中

environment = environmentFactory.openEnvironment;
try {
  PvmDbSession pvmDbSession = environment.get(PvmDbSession.);

  Execution execution = pvmDbSession.findExecution("persisted process", "first");
  assertNotNull(execution);
  assertEquals("one", execution.getActivity.getName);

  // external trigger that will cause the execution to execute until
  // it reaches the next wait state
  execution.signal;

  assertEquals("two", execution.getActivity.getName);

  pvmDbSession.save(execution);

} finally {
  environment.close;
}


   前个事务会对已存在执行进行更新 重新分配外键引用活动表中条记录

UPDATE JBPM_EXECUTION
SET
  NODE_=?,
  DBVERSION_=?,
  ...
WHERE DBID_=?
  AND DBVERSION_=?


   SQL中版本显示了自动乐观锁加入了PVM持久化中 所以流程持久化可以很容易 在多JVM或多机器环境下使用

   在例子代码中这里又有个事务它和前个事务 完全相同从'two'活动到'three'活动 获得了执行

   所有这个展示了PVM可以在事务中从个等待状态移动到 另个等待状态每个事务对应 个状态转移



   注意在自动活动情况下多个活动会在执行 到达个等待状态前被执行 般来说这是期望行为旦自动活动消耗太长时间 你不希望阻塞原始事务等待这些自动活动完成 参考??? 来获得它可以如何在流程定义的间将事务划分界限 这也可以看做是个流程执行过程中安全点

   14.5. 业务键

   TODO

   TODO: 常规持久化架构

   TODO: 对象引用

   TODO: 线程通过分支和结合实现同步

   TODO: 缓存Cache

   TODO: 流程例子迁移



Tags:  对象持久化 数据持久化 持久化 jbpm4.0

延伸阅读

最新评论

发表评论