Начинающий программист, изучающий сводку Activiti

Java

Эта статья является кратким изложением результатов личного изучения, в основном обобщает функции нескольких основных API и описание распространенных конфигураций.

Друзья, которым это нравится, могут щелкнуть, чтобы подписаться, и все могут учиться и прогрессировать вместе.

1. Что такое Активити

  activiti — это платформа с открытым исходным кодом для управления бизнес-процессами, которая поддерживает протокол определения процессов BPMN2.0. Его основные функции включают определение процесса, развертывание процесса, выполнение процесса, управление группами пользователей, запрос исторических записей и другие функции. Чем сложнее бизнес, тем больше инструментов для управления процессами требуется.Хорошим выбором является Activiti.От утверждения системы открытого доступа до покупки системы электронной коммерции, Activiti можно увидеть в этих сложных бизнес-сценариях. При хардкодировании сложного бизнеса лог-оценка каждого шага полна рисков: если вы не будете осторожны, вы не получите желаемого результата, а отследить проблему очень хлопотно. При написании сложного бизнеса на основе activiti файл определения процесса рисуется в соответствии со спецификацией, и бизнес можно увидеть с первого взгляда, что значительно снижает вероятность сложных бизнес-ошибок.

2. Почему стоит выбрать Активити

  1. actitvti поддерживает протокол определения процессов BPMN2.0.
  2. Activiti очень удобно интегрировать со Spring, и даже реализует Starter, интегрировать SpringBoot удобнее.
  3. Сообщество Activiti активно, записи на github часто публикуются, и разработчики постоянно вносят в него свой вклад.
  4. API-интерфейсы, предоставляемые activiti, очень богаты и могут удовлетворить большинство бизнес-сценариев.

3. Основной API-интерфейс Activiti

  activiti предоставляет пользователям большое количество интерфейсов, которые могут выполнять все операции от развертывания процесса, операции процесса и запроса истории процесса. Существует семь основных API:

  1. RepositoryService, основная функция, развертывает файлы определения процесса и управляет экземплярами определения процесса.
  2. Основная функция RuntimeService запускает процесс, управляет экземпляром процесса, устанавливает и получает переменные процесса.
  3. TaskService, главная роль, обработка задач, установка кандидатов задач (групп), указание обработчиков задач (групп), настройка вложений и т.д.
  4. FormService, основная функция, получает данные формы задачи, отправляет задачу для завершения и запускает процесс.
  5. HistoryService, основная функция, записи истории процесса запроса, записи событий, записи переменных.
  6. IdentityService, основная роль, создание пользователей, создание групп, запросы пользователей (групп).
  7. ManagementService, основная функция, выполняет пользовательские команды, запрашивает базовые объекты, таблицы данных и предоставляет более расширенные функции.

В-четвертых, инструкции по настройке Activiti

   Следующая конфигурация представляет собой файл XML при интеграции с Spring.Если SpingBoot интегрирован, соответствующий Bean также можно настроить в проекте SpringBoot на основе аннотаций. Также можно интегрировать Starter, реализованный activiti, чтобы проект автоматически собирал часто используемые bean-компоненты в соответствии с файлом yml и предоставлял ядро ​​API.

<?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="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
    <!-- 设置数据源, 指定项目中配置的数据源的bean -->
    <property name="dataSource" ref="dataSource"/>

    <!-- 设置项目启动数据库表的更新策略 -->
    <!--flase: 默认值。activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常。-->
    <!--true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建。-->
    <!--create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)。-->
    <!--drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)。-->
    <property name="databaseSchemaUpdate" value="true"/>

    <!-- 为所有的表名加前缀 -->
    <!--<property name="databaseTablePrefix" value="t_" />-->

    <!-- 指定数据库类型 -->
    <property name="databaseType" value="mysql" />

    <!-- 配置历史记录保存的级别 -->
    <!--none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。-->
    <!--activity:级别高于none,保存流程实例与流程行为,其他数据不保存。-->
    <!--audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。-->
    <!--full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。-->
    <property name="history" value="full"/>

    <!-- 配置是否使用历史记录相关的表 -->
    <property name="dbHistoryUsed" value="true"/>

    <!-- 配置是否使用用户权限相关的表 -->
    <property name="dbIdentityUsed" value="true"/>

    <!--配置自定义命令拦截器,配置到默认拦截器之前执行-->
    <property name="customPreCommandInterceptors">
      <list>
        <!-- 拦截器需要实现 AbstractCommandInterceptor 抽象类 -->
        <bean class="com.fbl.activiti6spring.interceptor.ExecutionTimeInterceptor"/>
      </list>
    </property>

    <!--配置自定义命令拦截器,配置到默认拦截器之后执行-->
    <property name="customPostCommandInterceptors">
      <list>
        <bean class="com.fbl.activiti6spring.interceptor.ExecutionTimeInterceptor"/>
      </list>
    </property>

    <!-- 设置是否开启异步执行功能,开启后可以实现定时开启流程等功能 -->
    <property name="asyncExecutorActivate" value="true"/>
    <!-- 设置异步任务的线程池 -->
    <property name="asyncExecutor">
      <bean class="org.activiti.engine.impl.asyncexecutor.DefaultAsyncJobExecutor">
        <!-- 指定一个executorService(线程池)bean -->
        <property name="executorService" ref="executorService"/>
      </bean>
    </property>

    <!-- 配置自定义事件监听器,在activiti中定义了许多事件,在事件发生时会被监听器监听到,比如流程启动时间、流程结束事件。也可以自定义一个事件,runtimeService.dispatchEvent()手动发出一个事件 -->
    <property name="eventListeners">
      <list>
        <!-- 事件监听器需要实现ActivitiEventListener接口 -->
        <bean class="com.fbl.activiti6spring.event.ProcessInstanceEventListener"/>
        <bean class="com.fbl.activiti6spring.event.CustomEventListener"/>
      </list>
    </property>

    <!--只监听指定类型的事件,PROCESS_STARTED是流程开始事件-->
    <!--<property name="typedEventListeners">-->
    <!--  <map>-->
    <!--    <entry key="PROCESS_STARTED">-->
    <!--      <bean class="com.fbl.activiti.activitidome.event.ProcessInstanceEventListener"/>-->
    <!--    </entry>-->
    <!--  </map>-->
    <!--</property>-->

    <!-- 配置事务管理器 -->
    <property name="transactionManager" ref = "transactionManager"/>

  </bean>


  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/activiti6?useSSL=false&amp;characterEncoding=UTF-8" />
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="username" value="root" />
    <property name="password" value="1234" />
    <property name="initialSize" value="1" />
    <property name="maxActive" value="10" />
    <property name="filters" value="stat,slf4j" />
  </bean>

  <!-- 配置Spring事务管理器 -->
  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
  </bean>

  <!-- 配置线程池,提供异步任务执行的环境 -->
  <bean id="executorService" class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean">
    <property name="threadNamePrefix" value="activiti_"/>
    <property name="corePoolSize" value="5" />
    <property name="maxPoolSize" value="10" />
    <property name="queueCapacity" value="20" />
    <property name="rejectedExecutionHandler">
      <bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/>
    </property>
  </bean>

  <!-- 创建流程核心Api工厂Bean -->
  <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
    <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
  </bean>
  
  <!-- 将activiti的测试Rule,注册到容器 -->
  <bean id="activitiRule" class="org.activiti.engine.test.ActivitiRule">
    <!--<property name="processEngineConfiguration" ref="processEngineConfiguration"/>-->
    <property name="processEngine" ref="processEngine" />
  </bean>

  <!-- 把想要使用的Activiti核心Api 注册到容器中 -->
  <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>
  <bean id="formService" factory-bean="processEngine" factory-method="getFormService"/>
  <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
  <bean id="helloWordServices" class="com.fbl.activiti6spring.services.HelloWordServices" />

</beans>