美文网首页Java
activiti6.0从入门到放弃

activiti6.0从入门到放弃

作者: 锦城牛仔 | 来源:发表于2020-01-08 15:06 被阅读0次

目前几大Java开源流程引擎:Activiti6、JBoss JBPM 6.5、JFlow 6.0。都说activiti文档最全,资料最丰富,于是就研究了一下,分享给大家。

一、入门——集成spring mvc

1、修改pom.xml

    <activti.engine.version>6.0.0</activti.engine.version>

    <dependency>

      <groupId>org.activiti</groupId>

      <artifactId>activiti-engine</artifactId>

      <version>${activti.engine.version}</version>

    </dependency>

    <dependency>

      <groupId>org.activiti</groupId>

      <artifactId>activiti-spring</artifactId>

      <version>${activti.engine.version}</version>

    </dependency>

2、添加spring-activiti.xml

为隔离其他业务表,activiti使用独立datasource,单独配置transactionManager事务回滚。以及自动部署bpmn文件。

<?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">

    <bean id="transactionManager_activiti"

          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource_activiti"/>

    </bean>

    <bean id="transactionInterceptor"

          class="org.springframework.transaction.interceptor.TransactionInterceptor">

        <property name="transactionManager" ref="transactionManager_activiti" />

        <!-- 配置事务属性 -->

        <property name="transactionAttributes">

            <props>

                <prop key="*">PROPAGATION_REQUIRED</prop>

            </props>

        </property>

    </bean>

    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

        <property name="beanNames">

            <list>

                <value>repositoryService</value>

                <value>runtimeService</value>

                <value>taskService</value>

                <value>historyService</value>

                <value>managementService</value>

                <value>identityService</value>

            </list>

        </property>

        <property name="interceptorNames">

            <list>

                <value>transactionInterceptor</value>

            </list>

        </property>

    </bean>

    <!-- activiti datasource -->

    <bean id="dataSource_activiti" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">

        <property name="driverClassName" value="${jdbc.activiti.driverClass}"/>

        <property name="url" value="${jdbc.activiti.jdbcUrl}"/>

        <property name="username" value="${jdbc.activiti.user}"/>

        <property name="password" value="${jdbc.activiti.password}"/>

        <property name="defaultAutoCommit" value="${jdbc.activiti.auto-commit}" />

        <property name="testWhileIdle" value="true" />

        <property name="validationQuery" value="SELECT 1" />

    </bean>

    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">

        <property name="dataSource" ref="dataSource_activiti"/>

        <property name="transactionManager" ref="transactionManager_activiti"/>

        <property name="databaseSchemaUpdate" value="true"/>

        <property name="asyncExecutorActivate" value="true"/>

        <property name="deploymentResources" value="classpath*:/activiti/*.bpmn"/>

    </bean>

    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">

        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>

    </bean>

    <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>

    <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>

    <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>

    <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>

    <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/>

    <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>

</beans>

3、使用idea2018安装bpmn插件后,绘制流程图

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1578358782707" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">

  <process id="copy02" isClosed="false" isExecutable="true" processType="None">

    <startEvent id="_2" name="StartEvent"/>

    <userTask activiti:candidateGroups="RoleDeptSuper" activiti:exclusive="true" id="_3" name="DeptSuper"/>

    <sequenceFlow id="_4" sourceRef="_2" targetRef="_3"/>

    <exclusiveGateway gatewayDirection="Unspecified" id="_5" name="SecretLevel"/>

    <sequenceFlow id="_6" sourceRef="_3" targetRef="_5"/>

    <userTask activiti:candidateGroups="RoleInstituteLeader" activiti:exclusive="true" id="_7" name="InstituteSuper"/>

    <userTask activiti:candidateGroups="RoleCopier" activiti:exclusive="true" id="_8" name="DoCopy"/>

    <sequenceFlow id="_9" sourceRef="_5" targetRef="_8">

      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${secret==2}]]></conditionExpression>

    </sequenceFlow>

    <sequenceFlow id="_10" sourceRef="_5" targetRef="_7">

      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${secret==3}]]></conditionExpression>

    </sequenceFlow>

    <sequenceFlow id="_11" sourceRef="_7" targetRef="_8"/>

    <endEvent id="_12" name="EndEvent"/>

    <sequenceFlow id="_13" sourceRef="_8" targetRef="_12"/>

  </process>

  <bpmndi:BPMNDiagram documentation="background=#3C3F41;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">

    <bpmndi:BPMNPlane bpmnElement="copy02">

      <bpmndi:BPMNShape bpmnElement="_2" id="Shape-_2">

        <omgdc:Bounds height="32.0" width="32.0" x="275.0" y="35.0"/>

        <bpmndi:BPMNLabel>

          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>

        </bpmndi:BPMNLabel>

      </bpmndi:BPMNShape>

      <bpmndi:BPMNShape bpmnElement="_3" id="Shape-_3">

        <omgdc:Bounds height="55.0" width="85.0" x="250.0" y="145.0"/>

        <bpmndi:BPMNLabel>

          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>

        </bpmndi:BPMNLabel>

      </bpmndi:BPMNShape>

      <bpmndi:BPMNShape bpmnElement="_5" id="Shape-_5" isMarkerVisible="false">

        <omgdc:Bounds height="32.0" width="32.0" x="270.0" y="280.0"/>

        <bpmndi:BPMNLabel>

          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>

        </bpmndi:BPMNLabel>

      </bpmndi:BPMNShape>

      <bpmndi:BPMNShape bpmnElement="_7" id="Shape-_7">

        <omgdc:Bounds height="55.0" width="85.0" x="125.0" y="380.0"/>

        <bpmndi:BPMNLabel>

          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>

        </bpmndi:BPMNLabel>

      </bpmndi:BPMNShape>

      <bpmndi:BPMNShape bpmnElement="_8" id="Shape-_8">

        <omgdc:Bounds height="55.0" width="85.0" x="240.0" y="500.0"/>

        <bpmndi:BPMNLabel>

          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>

        </bpmndi:BPMNLabel>

      </bpmndi:BPMNShape>

      <bpmndi:BPMNShape bpmnElement="_12" id="Shape-_12">

        <omgdc:Bounds height="32.0" width="32.0" x="280.0" y="625.0"/>

        <bpmndi:BPMNLabel>

          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>

        </bpmndi:BPMNLabel>

      </bpmndi:BPMNShape>

      <bpmndi:BPMNEdge bpmnElement="_13" id="BPMNEdge__13" sourceElement="_8" targetElement="_12">

        <omgdi:waypoint x="296.0" y="555.0"/>

        <omgdi:waypoint x="296.0" y="625.0"/>

        <bpmndi:BPMNLabel>

          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>

        </bpmndi:BPMNLabel>

      </bpmndi:BPMNEdge>

      <bpmndi:BPMNEdge bpmnElement="_4" id="BPMNEdge__4" sourceElement="_2" targetElement="_3">

        <omgdi:waypoint x="291.0" y="67.0"/>

        <omgdi:waypoint x="291.0" y="145.0"/>

        <bpmndi:BPMNLabel>

          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>

        </bpmndi:BPMNLabel>

      </bpmndi:BPMNEdge>

      <bpmndi:BPMNEdge bpmnElement="_6" id="BPMNEdge__6" sourceElement="_3" targetElement="_5">

        <omgdi:waypoint x="286.0" y="200.0"/>

        <omgdi:waypoint x="286.0" y="280.0"/>

        <bpmndi:BPMNLabel>

          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>

        </bpmndi:BPMNLabel>

      </bpmndi:BPMNEdge>

      <bpmndi:BPMNEdge bpmnElement="_9" id="BPMNEdge__9" sourceElement="_5" targetElement="_8">

        <omgdi:waypoint x="286.0" y="312.0"/>

        <omgdi:waypoint x="286.0" y="500.0"/>

        <bpmndi:BPMNLabel>

          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>

        </bpmndi:BPMNLabel>

      </bpmndi:BPMNEdge>

      <bpmndi:BPMNEdge bpmnElement="_11" id="BPMNEdge__11" sourceElement="_7" targetElement="_8">

        <omgdi:waypoint x="165.0" y="435.0"/>

        <omgdi:waypoint x="165.0" y="535.0"/>

        <omgdi:waypoint x="240.0" y="535.0"/>

        <bpmndi:BPMNLabel>

          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>

        </bpmndi:BPMNLabel>

      </bpmndi:BPMNEdge>

      <bpmndi:BPMNEdge bpmnElement="_10" id="BPMNEdge__10" sourceElement="_5" targetElement="_7">

        <omgdi:waypoint x="270.0" y="296.0"/>

        <omgdi:waypoint x="165.0" y="335.0"/>

        <omgdi:waypoint x="165.0" y="380.0"/>

        <bpmndi:BPMNLabel>

          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>

        </bpmndi:BPMNLabel>

      </bpmndi:BPMNEdge>

    </bpmndi:BPMNPlane>

  </bpmndi:BPMNDiagram>

</definitions>

4、启动流程

public class ActFlowServiceImpl implements ActFlowService {

    public static Logger logger = LoggerFactory.getLogger(ActFlowServiceImpl.class);

    @Autowired

    ProcessEngineFactoryBean processEngine;

    @Autowired

    private RepositoryService repositoryService;

    @Autowired

    private RuntimeService runtimeService;

    @Autowired

    private TaskService taskService;

    @Autowired

    private HistoryService historyService;

    @Autowired

    private IdentityService identityService;

    @Autowired

    private ManagementService managementService;

    @Override

    public int ActFlowCopy(Map<String, Object> variables){

        String copyFlow = "copy02";

        //流程发起人

        String submitter = (String)variables.get("submitterId");

        //设置流程发起人

        identityService.setAuthenticatedUserId(submitter);

        //发起流程

        runtimeService.startProcessInstanceByKey(copyFlow, variables);

        return 0;

    }

}

5、数据库

5.1 部署表

5.2 流程定义表

5.3 流程实例表

5.4 变量表

二、放弃——查询太麻烦

1、查询指定发起人的流程

List<HistoricProcessInstance> unFinishedList = historyService.createHistoricProcessInstanceQuery()

                .startedBy(submitter).orderByProcessInstanceStartTime().desc()

                .list();

分析:可以通过historyService进行查询,但是得到的仅是HistoricProcessInstance。如果流程中需要显示“流程当前步骤数”、“流程总步骤数”、“下一步处理人”。这些信息还需要根据流程实例id进入二次查询。如果要获得流程变量,也需要单独查询。如果想在一条记录中包括这些信息,会比较麻烦。更麻烦的是还要分页查询,无法集成通用分页PageHelper,需要另外维护一套分页信息。

2、activiti有自带的用户关系表。如果是已有用户认证授权系统,需要考虑与activiti自带的表进行适配协调。

结论:

如果是需求比较明确,流程相对固定的情况,建议自行开发。

如果是流程非常复杂,流程中分支特别多,可以考虑使用activiti,但类似“下一步处理人”这种需求要特殊处理。

如果要用activiti最好是抱着完全摸清楚表结构,并适当二次开发,来适应需求。总之,适合自己的才是最好的。

相关文章

网友评论

    本文标题:activiti6.0从入门到放弃

    本文链接:https://www.haomeiwen.com/subject/umlsactx.html