摘要
Activiti工作流引擎集成CDI,让工作流更灵活、更可扩展。通过activiti-cdi控制模块,可以轻松管理@BusinessProcessScoped beans和与步骤案例相关的cdi bean。这样,就可以使用自定义ELCP等功能,让工作流引擎更加智能化。
正文
工作流引擎中容器化的依赖注入!Activiti集成化CDI完成工作流引擎的可配备型和可拓展型
Activiti工作流引擎集成化CDI介绍
- activiti-cdi控制模块给予activiti的可配备型和cdi拓展
- activiti-cdi的特点:
- 适用 @BusinessProcessScoped beans, 关联到步骤案例的cdi bean
- 步骤为cdi bean适用自定ELCPU
- 应用注释为步骤案例给予申明式操纵
- Activiti能够建空在cdi事情系统总线上
- 适用Java EE和Java SE, 适用Spring
- 适用单元测试卷
- 要在maven新项目中应用activiti-cdi,必须加上依靠:
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-cdi</artifactId>
<version>5.8</version>
</dependency>
- activiti-cdi 5.6之上的版本号会全自动添加activiti-entin和spring
设定activiti-cdi
- Activiti cdi能够安裝在不一样自然环境中
搜索流程引擎
- cdi拓展必须浏览到ProcessEngine, 为了更好地完成此作用:
- 应用org.activiti.cdi.spi.ProcessEngineLookup插口在运作期内开展搜索
- cdi控制模块应用默认设置的名叫org.activiti.cdi.impl.LocalProcessEngineLookup的完成,应用ProcessEngines这一java工具来搜索ProcessEngine
- 默认设置配备下,应用ProcessEngines#NAME_DEFAULT来搜索ProcessEngine.这一类可能是应用自定名字的派生类
- 留意: 必须把activiti.cfg.xml放到classpath下
- Activiti cdi应用java.util.ServiceLoader SPI解决org.activiti.cdi.spi.ProcessEngineLookup的案例
- 为了更好地给予插口的自定完成,必须建立一个文本文档,名叫META-INF/services/org.activiti.cdi.spi.ProcessEngineLookup, 在文档中必须特定完成的全类名
- 假如你沒有给予自定的org.activiti.cdi.spi.ProcessEngineLookup完成,activiti会应用默认设置的LocalProcessEngineLookup完成,必须做的便是把activiti.cfg.xml放进classpath下
配备Process Engine
- 具体的配备取决于采用的ProcessEngineLookup对策
- 在这儿关键融合LocalProcessEngineLookup探讨可以用的配备,规定在classpath下给予一个spring的activiti.cfg.xml
- Activiti给予了不一样的ProcessEngineConfiguration完成,主要是依靠具体应用的事务管理管理模式
- activiti-cdi控制模块对事务管理的规定不严苛,代表着一切事务管理管理模式都能够应用,就算是spring事务管理抽象性层
- cdi控制模块给予二种自定ProcessEngineConfiguration完成:
- org.activiti.cdi.CdiJtaProcessEngineConfiguration: activiti的JtaProcessEngineConfiguration的派生类,用以在activiti应用JTA管理方法的事务管理自然环境
- org.activiti.cdi.CdiStandaloneProcessEngineConfiguration: activiti的StandaloneProcessEngineConfiguration的派生类,用以在activiti应用简易JDBC事务管理自然环境
- JBoss7下的activiti.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- lookup the JTA-Transaction manager -->
<bean id="transactionManager" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:jboss/TransactionManager"></property>
<property name="resourceRef" value="true" />
</bean>
<!-- process engine configuration -->
<bean id="processEngineConfiguration"
class="org.activiti.cdi.CdiJtaProcessEngineConfiguration">
<!-- lookup the default Jboss datasource -->
<property name="dataSourceJndiName" value="java:jboss/datasources/ExampleDS" />
<property name="databaseType" value="h2" />
<property name="transactionManager" ref="transactionManager" />
<!-- using externally managed transactions -->
<property name="transactionsExternallyManaged" value="true" />
<property name="databaseSchemaUpdate" value="true" />
</bean>
</beans>
- 在Glassfish 3.1.1,假定配备好名叫jdbc/activiti的datasource:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- lookup the JTA-Transaction manager -->
<bean id="transactionManager" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:appserver/TransactionManager"></property>
<property name="resourceRef" value="true" />
</bean>
<!-- process engine configuration -->
<bean id="processEngineConfiguration"
class="org.activiti.cdi.CdiJtaProcessEngineConfiguration">
<property name="dataSourceJndiName" value="jdbc/activiti" />
<property name="transactionManager" ref="transactionManager" />
<!-- using externally managed transactions -->
<property name="transactionsExternallyManaged" value="true" />
<property name="databaseSchemaUpdate" value="true" />
</bean>
</beans>
- 留意: 上边的配备要引进spring-context控制模块依靠
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.0.3.RELEASE</version>
</dependency>
公布步骤
- 能够应用规范的activiti-api公布步骤-RepositoryService
- activiti-cdi也给予了全自动公布classpath下processes.xml中列举的步骤的方法
- processes.xml:
<?xml version="1.0" encoding="utf-8" ?>
<!-- list the processes to be deployed -->
<processes>
<process resource="diagrams/myProcess.bpmn20.xml" />
<process resource="diagrams/myOtherProcess.bpmn20.xml" />
</processes>
根据CDI自然环境的步骤实行
- BPMN工作流程一般是一个长期运作的实际操作,包括了客户和系统软件每日任务的实际操作
- 运作全过程中,步骤会分为好几个独立的工作中模块,由客户和应用逻辑实行
- 在activiti-cdi中,步骤案例能够分派到cdi自然环境中,关系呈现成一个工作中模块:
- 它是十分有效的,假如工作中模块太繁杂:例如假如完成的客户每日任务是不一样方式的繁杂次序,能够在这个实际操作中维持non-process-scoped情况
- 默认设置配备下,步骤案例分派到broadest激话自然环境,便会运行互动,假如互动自然环境沒有激话,便会回到到要求中
与步骤案例开展关系互动
- 解决 @BusinessProcessScoped beans, 或引入步骤自变量时,完成了激话的cdi自然环境与步骤案例的关系
- Activiti-cdi给予了org.activiti.cdi.BusinessProcess bean来操纵关系:
- startProcessByXx(…): 相匹配activiti的RuntimeService中的有关方式 ,容许运行和接着向关系的工作流程
- resumeProcessById(String processInstanceId): 容许根据给予的Id来关系步骤案例
- resumeTaskById(String taskId): 容许根据给予的Id来关系每日任务,还可以拓展关系步骤案例
- 一个工作中模块进行后 ,completeTask() 方式 能够启用来消除步骤案例和对话或要求的关系.这会通告activiti当前任务早已进行,并让步骤案例执行
- BusinessProcess bean是 @Named bean, 意思是导出来的方式 能够根据关系式语言表达启用:
- 例如在JSF网页页面中.下边的JSF 2 编码运行一个新的互动,分派给一个客户每日任务案例,Id做为一个要求参数传递:
<f:metadata>
<f:viewParam name="taskId" />
<f:event type="preRenderView" listener="#{businessProcess.startTask(taskId, true)}" />
</f:metadata>
申明式步骤操纵
- Activiti-cdi容许根据注释申明运行步骤案例和达到目标
- @org.activiti.cdi.annotation.StartProcess注释容许根据key或name运行步骤案例.步骤案例会在注释的方式 回到以后运行:
@StartProcess("authorizeBusinessTripRequest")
public String submitRequest(BusinessTripRequest request) {
// do some work
return "success";
}
- 依据activiti的配备,注释方式 的编码和运行步骤案例会在同一个事务管理中实行 .@org.activiti.cdi.annotation.CompleteTask事务管理的应用方法同样:
@CompleteTask(endConversation=false)
public String authorizeBusinessTrip() {
// do some work
return "success";
}
@CompleteTask注释能够完毕当今对话.默认设置个人行为会在activiti回到后完毕对话.能够禁止使用完毕对话的作用
在步骤中引入bean
- Activiti-cdi应用自定在线解析把CDI bean曝露到activiti El中,能够在步骤中引入这种bean:
<userTask id="authorizeBusinessTrip" name="Authorize Business Trip"
activiti:assignee="#{authorizingManager.account.username}" />
- authorizingManager能够是经营者方式 给予的bean:
@Inject @ProcessVariable Object businessTripRequesterUsername;
@Produces
@Named
public Employee authorizingManager() {
TypedQuery<Employee> query = entityManager.createQuery("SELECT e FROM Employee e WHERE e.account.username='"
businessTripRequesterUsername "'", Employee.class);
Employee employee = query.getSingleResult();
return employee.getManager();
应用@BusinessProcessScoped beans
- 应用activiti-cdi,bean的生命期能够关联到步骤案例上:
- 能够给予一个自定的自然环境完成,取名为BusinessProcessContext.
- BusinessProcessScoped bean的案例会做为步骤自变量储存到当今步骤案例中
- BusinessProcessScoped bean必须是PassivationCapable,例如实例化
- 应用步骤修饰符bean的实例以下:
@Named
@BusinessProcessScoped
public class BusinessTripRequest implements Serializable {
private static final long serialVersionUID = 1L;
private String startDate;
private String endDate;
// ...
}
- 有时候,必须应用步骤修饰符bean,沒有与步骤案例关系:
- 例如运行步骤以前.假如当今步骤案例沒有激话 ,BusinessProcessScoped bean案例会临时储存在部分修饰符里:
- 对话
- 要求
- 依靠自然环境
- 例如运行步骤以前.假如当今步骤案例沒有激话 ,BusinessProcessScoped bean案例会临时储存在部分修饰符里:
- 假如修饰符之后与工作流程案例关系了,bean案例会更新到步骤案例里
引入步骤自变量
- 步骤自变量能够完成用以引入
- Activiti-CDI适用下列引入步骤自变量的方法:
- @BusinessProcessScoped应用 @Inject [额外装饰] 种类 特性名完成种类安全性的步骤自变量的引入
- 应用@ProcessVariable(name)修饰符完成对种类不安全的步骤自变量的引入
@Inject @ProcessVariable Object accountNumber;
@Inject @ProcessVariable("accountNumber") Object account
- 为了更好地根据EL引入步骤自变量, 能够应用以下方法:
- @Named @BusinessProcessScoped beans能够直接引入
- 别的步骤自变量能够应用ProcessVariables bean来应用
#{processVariables['accountNumber']}
接受步骤事情
- Activiti能够挂在CDI的事情系统总线上,就可以应用规范CDI事情体制来监视步骤事情
- 为了更好地开启activiti的CDI事情适用,必须在配备中开启相匹配的分析窃听器:
<property name="postBpmnParseHandlers">
<list>
<bean class="org.activiti.cdi.impl.event.CdiEventSupportBpmnParseHandler" />
</list>
</property>
- 那样activiti就配备变成应用CDI事情系统总线公布事情
- 在CDI bean中事件处理的方法:
- 应用@Observes注释申明特殊的事情窃听器
- 事情监视是种类安全性的
- 步骤事情种类是org.activiti.cdi.BusinessProcessEvent
- 一个简易事情监视方式 实例:
public void onProcessEvent(@Observes BusinessProcessEvent businessProcessEvent) {
// handle event
}
- 窃听器能够监视全部事情.假如想限定窃听器接受的事情种类,能够加上装饰注释:
- @BusinessProcess: 限定特定步骤界定的事情
- @Observes @BusinessProcess(“billingProcess”)
- @StartActivity: 限定特定进到阶段的事情
- @Observes @StartActivity(“shipGoods”)
- @EndActivity: 限定特定完毕阶段的事情
- @Observes @EndActivity(“shipGoods”)
- @TakeTransition: 限定特定联线的事情
- @BusinessProcess: 限定特定步骤界定的事情
- 装饰取名能够随意搭配:
- 为了更好地接受shipmentProcess步骤中全部离去shipGoods阶段的事情:
public void beforeShippingGoods(@Observes @BusinessProcess("shippingProcess") @EndActivity("shipGoods") BusinessProcessEvent evt) {
// handle event
}
- 默认设置配备下,事情窃听器是同歩启用,并在同一个事务管理自然环境中
- CDI事务性工作窃听器能够操纵窃听器何时事件处理:
- 能够确保窃听器只在事情中的事务管理取得成功以后才解决
public void onShipmentSuceeded(@Observes(during=TransactionPhase.AFTER_SUCCESS) @BusinessProcess("shippingProcess") @EndActivity("shipGoods") BusinessProcessEvent evt) {
// send email to customer.
}
Activiti CDI中的更多用途
- 流程引擎和服务项目都能够引入: Inject ProcessEngine,RepositoryService,TaskService,…
- 当今步骤案例和每日任务能够引入: @Inject ProcessInstance, Task
- 当今业务流程标志能够引入: @Inject @BusinessKey String businessKey
- 当今步骤案例id能够引入: @Inject @ProcessInstanceId String pid
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
温馨提示:如果您访问和下载本站资源,表示您已同意只将下载文件用于研究、学习而非其他用途。
评论0