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: 流程例子迁移
最新评论