jBPM允许存储某些信息。 jBPM持久性是一种运行时持久性,它持久保存所有流程实例的状态,并记录在流程运行时发生的审计信息。 持久性的主要目的是在等待状态期间存储进程执行。 本节介绍不同类型的持久性以及如何配置它们。
运行时状态持久性
当进程启动时,立即创建其实例,该实例表示该特定上下文中的当前执行状态。如果在执行进程期间出现问题,则必须存储进程运行时状态,这有助于继续执行进程实例。例如,当我们执行销售订单流程时,会为每个销售请求创建一个流程实例。
jBPM为不同的持久性策略提供插件。可以使执行进程的运行时状态持久。持久性策略允许在意外故障的情况下恢复所有正在运行的进程的执行状态。
要使用持久性,我们必须配置流程引擎。此配置将自动将运行时状态存储到数据库中。我们不能自己触发持久性。启用持久性时,流程引擎将处理此问题。引擎将根据需要自动重新加载流程实例。
二进制持久性
二进制持久性机制用于将进程状态实例信息转换为二进制数据集。 此机制用于从数据库中保存或检索流程实例状态。
在二进制持久性中,当持久化流程实例状态时会发生两件事 -
- 流程实例信息的状态转换为二进制blob。
- 此二进制blob将使用此流程实例存储一些其他元数据。元数据包括流程实例ID,流程ID和流程开始日期。
审计日志
jBPM审核日志使用JPA将执行信息的历史日志存储在数据库中。 在许多情况下,存储有关流程实例执行的信息非常有用,以便以后可以使用此信息。 例如,有时需要 -
- 验证已为特定流程实例执行了哪些操作。
- 监控和分析特定流程的效率。
执行信息的历史日志基于事件创建。 这是可能的,因为jBPM运行时引擎提供了一种适当的机制来监听事件。 可以从这些事件中轻松提取必要的信息,然后将其保存到数据库中。
事务
jBPM流程引擎支持JTA(Java Transaction API)事务。 它还通过使用Spring支持本地事务,但不支持纯本地事务。 在jBPM中,有必要在应用程序内提供事务边界。 如果不在应用程序内部提供事务边界,则引擎将在单独的事务中自动调用每个执行方法。 但是,也可以指定事务边界本身。 这允许将多个命令组合到一个事务中。
要创建用户定义的事务,我们需要在环境中注册事务管理器。 以下示例代码了解如何创建事务管理器。
// create the entity manager factory
EntityManagerFactory emf = EntityManagerFactoryManager.get().getOrCreate("org.jbpm.persistence.jpa");
TransactionManager tm = TransactionManagerServices.getTransactionManager();
// setup the runtime environment
RuntimeEnvironment environment = RuntimeEnvironmentBuilder.Factory.get()
.newDefaultBuilder()
.addAsset(ResourceFactory.newClassPathResource("MyProcessDefinition.bpmn2"), ResourceType.BPMN2)
.addEnvironmentEntry(EnvironmentName.TRANSACTION_MANAGER, tm)
.get();
// get the kie session
RuntimeManager manager = RuntimeManagerFactory.Factory.get().newPerRequestRuntimeManager(environment);
RuntimeEngine runtime = manager.getRuntimeEngine(ProcessInstanceIdContext.get());
KieSession ksession = runtime.getKieSession();
// start the transaction
UserTransaction ut = InitialContext.doLookup("java:comp/UserTransaction");
ut.begin();
// perform multiple commands inside one transaction
ksession.insert( new Person( "John Doe" ) );
ksession.startProcess("MyProcess");
// commit the transaction
ut.commit();
持久性配置
可以通过配置流程引擎来使用持久性。 持久性配置需要添加必要的依赖项,配置数据源并使用配置的持久性创建引擎。
添加依赖项
如果使用jBPM Eclipse插件,必须确保将必要的JAR添加到jBPM运行时目录中。 我们可以在项目中手动添加必要的依赖项。 要手动添加依赖项,请执行以下步骤 -
- 需要JAR文件
jbpm-persistence-jpa.jar
。 它包含在必要时保存运行时状态的代码。 需要依赖于我们正在使用的持久性解决方案和数据库的各种其他依赖项。以下列出的一些依赖项 -
- jbpm-persistence-jpa (org.jbpm)
- drools-persistence-jpa (org.drools)
- persistence-api (javax.persistence)
- hibernate-entitymanager (org.hibernate)
- hibernate-annotations (org.hibernate)
- hibernate-commons-annotations (org.hibernate)
- hibernate-core (org.hibernate)
- commons-collections (commons-collections)
- dom4j (dom4j)
- jta (javax.transaction)
- btm (org.codehaus.btm)
- javassist
- slf4j-api (org.slf4j)
- slf4j-jdk14 (org.slf4j)
手动配置引擎以使用持久性
配置流程引擎,使用基于知识库的JPAKnowledgeService,知识会话配置和环境创建新的知识会话。
例如-
// create the entity manager factory and register it in the environment
EntityManagerFactory emf =
Persistence.createEntityManagerFactory( "org.jbpm.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
// create a new knowledge session that uses JPA to store the runtime state
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
int sessionId = ksession.getId();
// invoke methods on your method here
kSession.startProcess( "MyProcess" );
kSession.dispose();