个性化阅读
专注于IT技术分析

jBPM持久性和事务

本文概述

jBPM允许存储某些信息。 jBPM持久性是一种运行时持久性, 可持久保存我们所有流程实例的状态并记录在流程运行时发生的审核信息。持久性的主要目的是在等待状态期间存储流程执行。本节描述了持久性的不同类型以及如何配置它们。

运行时状态持久性

启动进程后, 将立即创建其实例, 该实例表示该特定上下文中的当前执行状态。如果在执行流程期间出了点问题, 则必须存储流程运行时状态, 这有助于继续执行流程实例。例如, 当我们执行销售订单流程时, 将为每个销售请求创建一个流程实例。

jBPM为不同的持久性策略提供了插件。可以使执行过程的运行时状态持久化。持久性策略允许在意外失败的情况下恢复所有正在运行的进程的执行状态。

要使用持久性, 我们必须配置流程引擎。此配置将自动将运行时状态存储到数据库中。我们不能触发持久性本身。启用持久性后, 流程引擎将对此进行处理。引擎将根据需要自动重新加载流程实例。

二进制余辉

二进制持久性机制用于将过程状态实例信息转换为二进制数据集。此机制用于从数据库保存或检索流程实例状态。

在二进制持久性中, 当流程实例状态被持久化时, 会发生两件事:

  1. 流程实例信息的状态转换为二进制Blob。
  2. 然后, 此二进制Blob将与此流程实例一起存储一些其他元数据。该元数据包括流程实例ID, 流程ID和流程开始日期。

审核日志

jBPM审核日志使用JPA将执行信息的历史日志存储在数据库中。在许多情况下, 存储有关流程实例执行的信息很有用, 以便以后可以使用此信息。例如, 有时我们需要-

  • 验证已为特定流程实例执行了哪些操作。
  • 监视和分析特定过程的效率。

执行信息的历史日志是基于事件创建的。这是可能的, 因为jBPM运行时引擎提供了侦听事件的适当机制。可以从这些事件中轻松提取必要的信息, 然后将其保存到数据库中。

交易

jBPM流程引擎支持JTA(Java交易API)交易。它还使用Spring支持本地事务, 但不支持纯本地事务。在jBPM中, 有必要在应用程序内部提供事务边界。如果我们没有在应用程序内部提供事务边界, 则引擎将在单独的事务中自动调用每个executes方法。但是, 我们也可以指定事务边界本身。这使我们可以将多个命令组合到一个事务中。

要创建用户定义的事务, 我们需要在环境中注册事务管理器。以下示例代码了解如何创建事务管理器。

// 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运行时目录中。我们可以在项目中手动添加必要的依赖项。要手动添加依赖项, 请执行以下步骤-

  1. 我们需要JAR文件jbpm-persistence-jpa.jar。它包含用于在必要时保存运行时状态的代码。
  2. 我们需要各种其他依赖项, 这些依赖项取决于我们使用的持久性解决方案和数据库。以下列出了一些依赖项-
  • 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)

手动配置引擎以使用持久性

基于知识库, 知识会话配置和环境, 配置流程引擎, 使用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();
赞(0)
未经允许不得转载:srcmini » jBPM持久性和事务

评论 抢沙发

评论前必须登录!