本文由 发布,转载请注明出处,如有问题请联系我们! 发布时间: 2021-06-12工作流中容器化的依赖注入!Activiti集成CDI实现工作流的可配置型和可扩展型

加载中

工作流引擎中容器化的依赖注入!Activiti集成化CDI完成工作流引擎的可配备型和可拓展型

Activiti工作流引擎集成化CDI介绍

  • activiti-cdi控制模块给予activiti的可配备型和cdi拓展
  • activiti-cdi的特点:
    • 适用 @BusinessProcessScoped beans, 关联到步骤案例的cdi bean
    • 步骤为cdi bean适用自定ELCPU
    • 应用注释为步骤案例给予申明式操纵
    • Activiti能够建空在cdi事情系统总线上
    • 适用Java EEJava SE, 适用Spring
    • 适用单元测试卷
  • 要在maven新项目中应用activiti-cdi,必须加上依靠:
<dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-cdi</artifactId>
        <version>5.8</version>
</dependency>
  • activiti-cdi 5.6之上的版本号会全自动添加activiti-entinspring

设定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下给予一个springactiviti.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也给予了全自动公布classpathprocesses.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注释容许根据keyname运行步骤案例.步骤案例会在注释的方式 回到以后运行:
@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案例会临时储存在部分修饰符里:
      • 对话
      • 要求
      • 依靠自然环境
  • 假如修饰符之后与工作流程案例关系了,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: 限定特定联线的事情
  • 装饰取名能够随意搭配:
    • 为了更好地接受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条)

刀客源码 游客评论