本文概述
- 运行时状态持久性
- 二进制余辉
- 审核日志
- 交易
- 持久性配置
- 添加依赖项
- 手动配置引擎以使用持久性
运行时状态持久性启动进程后, 将立即创建其实例, 该实例表示该特定上下文中的当前执行状态。如果在执行流程期间出了点问题, 则必须存储流程运行时状态, 这有助于继续执行流程实例。例如, 当我们执行销售订单流程时, 将为每个销售请求创建一个流程实例。
jBPM为不同的持久性策略提供了插件。可以使执行过程的运行时状态持久化。持久性策略允许在意外失败的情况下恢复所有正在运行的进程的执行状态。
要使用持久性, 我们必须配置流程引擎。此配置将自动将运行时状态存储到数据库中。我们不能触发持久性本身。启用持久性后, 流程引擎将对此进行处理。引擎将根据需要自动重新加载流程实例。
二进制余辉二进制持久性机制用于将过程状态实例信息转换为二进制数据集。此机制用于从数据库保存或检索流程实例状态。
在二进制持久性中, 当流程实例状态被持久化时, 会发生两件事:
- 流程实例信息的状态转换为二进制Blob。
- 然后, 此二进制Blob将与此流程实例一起存储一些其他元数据。该元数据包括流程实例ID, 流程ID和流程开始日期。
- 验证已为特定流程实例执行了哪些操作。
- 监视和分析特定过程的效率。
交易jBPM流程引擎支持JTA(Java交易API)交易。它还使用Spring支持本地事务, 但不支持纯本地事务。在jBPM中, 有必要在应用程序内部提供事务边界。如果我们没有在应用程序内部提供事务边界, 则引擎将在单独的事务中自动调用每个executes方法。但是, 我们也可以指定事务边界本身。这使我们可以将多个命令组合到一个事务中。
要创建用户定义的事务, 我们需要在环境中注册事务管理器。以下示例代码了解如何创建事务管理器。
// create the entity manager factoryEntityManagerFactory emf = EntityManagerFactoryManager.get().getOrCreate("org.jbpm.persistence.jpa");
TransactionManager tm = TransactionManagerServices.getTransactionManager();
// setup the runtime environmentRuntimeEnvironment environment = RuntimeEnvironmentBuilder.Factory.get().newDefaultBuilder().addAsset(ResourceFactory.newClassPathResource("MyProcessDefinition.bpmn2"), ResourceType.BPMN2).addEnvironmentEntry(EnvironmentName.TRANSACTION_MANAGER, tm).get();
// get the kie sessionRuntimeManager manager = RuntimeManagerFactory.Factory.get().newPerRequestRuntimeManager(environment);
RuntimeEngine runtime = manager.getRuntimeEngine(ProcessInstanceIdContext.get());
KieSession ksession = runtime.getKieSession();
// start the transactionUserTransaction ut = InitialContext.doLookup("java:comp/UserTransaction");
ut.begin();
// perform multiple commands inside one transactionksession.insert( new Person( "John Doe" ) );
ksession.startProcess("MyProcess");
// commit the transactionut.commit();
持久性配置持久性可以通过配置流程引擎来使用。持久性配置需要添加必要的依赖项, 配置数据源并使用已配置的持久性创建引擎。
添加依赖项如果使用的是jBPM Eclipse插件, 则必须确保将必要的JAR添加到我们的jBPM运行时目录中。我们可以在项目中手动添加必要的依赖项。要手动添加依赖项, 请执行以下步骤-
- 我们需要JAR文件jbpm-persistence-jpa.jar。它包含用于在必要时保存运行时状态的代码。
- 我们需要各种其他依赖项, 这些依赖项取决于我们使用的持久性解决方案和数据库。以下列出了一些依赖项-
- jbpm-persistence-jpa(org.jbpm)
- drools-persistence-jpa(org.drools)
- 持久性API(javax.persistence)
- hibernate-entitymanager(org.hibernate)
- hibernate注释(org.hibernate)
- hibernate-公共注释(org.hibernate)
- 休眠核心(org.hibernate)
- 公地集合(公地集合)
- dom4j(dom4j)
- jta(javax.transaction)
- btm(org.codehaus.btm)
- javassist
- slf4j-api(org.slf4j)
- slf4j-jdk14(org.slf4j)
例如-
// create the entity manager factory and register it in the environmentEntityManagerFactory 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 stateStatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
int sessionId = ksession.getId();
// invoke methods on your method herekSession.startProcess( "MyProcess" );
kSession.dispose();