Эта статья является кратким изложением результатов личного изучения, в основном обобщает функции нескольких основных API и описание распространенных конфигураций.
Друзья, которым это нравится, могут щелкнуть, чтобы подписаться, и все могут учиться и прогрессировать вместе.
1. Что такое Активити
activiti — это платформа с открытым исходным кодом для управления бизнес-процессами, которая поддерживает протокол определения процессов BPMN2.0. Его основные функции включают определение процесса, развертывание процесса, выполнение процесса, управление группами пользователей, запрос исторических записей и другие функции. Чем сложнее бизнес, тем больше инструментов для управления процессами требуется.Хорошим выбором является Activiti.От утверждения системы открытого доступа до покупки системы электронной коммерции, Activiti можно увидеть в этих сложных бизнес-сценариях. При хардкодировании сложного бизнеса лог-оценка каждого шага полна рисков: если вы не будете осторожны, вы не получите желаемого результата, а отследить проблему очень хлопотно. При написании сложного бизнеса на основе activiti файл определения процесса рисуется в соответствии со спецификацией, и бизнес можно увидеть с первого взгляда, что значительно снижает вероятность сложных бизнес-ошибок.
2. Почему стоит выбрать Активити
- actitvti поддерживает протокол определения процессов BPMN2.0.
- Activiti очень удобно интегрировать со Spring, и даже реализует Starter, интегрировать SpringBoot удобнее.
- Сообщество Activiti активно, записи на github часто публикуются, и разработчики постоянно вносят в него свой вклад.
- API-интерфейсы, предоставляемые activiti, очень богаты и могут удовлетворить большинство бизнес-сценариев.
3. Основной API-интерфейс Activiti
activiti предоставляет пользователям большое количество интерфейсов, которые могут выполнять все операции от развертывания процесса, операции процесса и запроса истории процесса. Существует семь основных API:
- RepositoryService, основная функция, развертывает файлы определения процесса и управляет экземплярами определения процесса.
- Основная функция RuntimeService запускает процесс, управляет экземпляром процесса, устанавливает и получает переменные процесса.
- TaskService, главная роль, обработка задач, установка кандидатов задач (групп), указание обработчиков задач (групп), настройка вложений и т.д.
- FormService, основная функция, получает данные формы задачи, отправляет задачу для завершения и запускает процесс.
- HistoryService, основная функция, записи истории процесса запроса, записи событий, записи переменных.
- IdentityService, основная роль, создание пользователей, создание групп, запросы пользователей (групп).
- 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&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>