一、 安裝和使用
安裝和使用Flowable需要先下載相應版本的Flowable,可以從官方網站、github等獲取,然後解壓後就可以開始使用。一般來說,使用Flowable分為三個主要步驟:1)建模工作流, 2)部署工作流,3)執行工作流
二、 工作流引擎核心模塊
Flowable工作流引擎的核心模塊包括:1)啟動子模塊,這個模塊負責載入其他模塊並啟動工作流引擎,2)存儲子模塊,負責管理工作流數據,3)運行時子模塊,這個子模塊負責提供運行時服務(例如任務分配、事件攔截器、作業操作等)
三、 啟動流程實例
啟動工作流引擎以及啟動工作流實例是Flowable的重要特性。啟動工作流實例是以一個定義好的BPMN 2.0 flow文件為模板來實現運行時流程能力的。在Flowable中,提供了多種啟動流程實例的方式,如通過key啟動、通過process definition id啟動等。
// 1. 獲取runtimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 2. 通過流程定義ID(key)來啟動流程實例
ProcessInstance instance = runtimeService.startProcessInstanceByKey("process_key");
四、 用戶任務
用戶任務是面向用戶的任務,需要手動完成。Flowable提供了一系列API來幫助程序員處理任務。在任務管理中,常見的操作包括:1)查詢待辦任務,2)領取任務,3)完成任務
// 1. 獲取TaskService
TaskService taskService = processEngine.getTaskService();
// 2. 獲取任務查詢對象
TaskQuery query = taskService.createTaskQuery();
// 3. 查詢指派給當前用戶的所有任務
query.taskAssignee("當前用戶ID");
// 獲取任務列表
List<Task> taskList = query.list();
// 完成任務
Task task = taskList.get(0);
taskService.complete(task.getId());
五、 定時器
定時器在Flowable中可以被稱之為作業,在一個工作流程中,發生的所有事件都是非常重要的,當發生事件時,Flowable需要在特定的時間觸發相應的操作。Flowable提供了一種適用於非同步事件處理的調度模式,這種模式基於Java Timer和Spring Task。 在Flowable中,定時器由「Timer Event」元素提供,可安排計劃來調度任務的運行。在處理內存資源緊張的情況下,Flowable定時器支持非同步處理事件,使輕量的流程引擎可以在決策期間執行長時間運行的操作。
// 1. 通過JobExecutor註冊定時器Service
JobExecutor jobExecutor = new JobExecutor();
FlowableScheduler bpmnScheduler = new BpmnJobScheduler(jobExecutor);
processEngineConfiguration.setBpmnJobExecutor(jobExecutor);
// 2. 添加定時器事件
TimerEventDefinition timerEventDefinition = eventDefs[0].querySingle("timerEventDefinition");
Definitions defs = rootElement.querySingle("definitions");
Process process = defs.querySingle("process");
UserTask task = process.querySingle("userTask");
BoundaryEvent boundaryEvent = task.getBoundaryEvent();
boundaryEvent.setAttachedToRef(task.getId());
boundaryEvent.setValues(flowJsonDelegate);
EventSubscriptionEntity subscriptionEntity = (EventSubscriptionEntity) runtimeService.createEventSubscriptionQuery()
.eventType(TimerEventEntity.EVENT_TYPE)
.processInstanceId(instance.getId())
.activityId(task.getId())
.singleResult();
// 啟動定時器
bpmnScheduler.schedule(new TimerEventHandler(subscriptionEntity));
六、事件攔截器
事件攔截器是Flowable流程引擎中實現AOP機制的一種方式。它為業務程序操作提供了一些手段來對流程狀態進行觀察和控制。流程執行過程中的各種事件事件(任務分配、任務開始、任務完成等)都會被攔截並分發到相應的事件監聽器中。 通過配置相關的事件監聽器來確定攔截器將生成哪些事件,然後將這些事件與其他業務邏輯相結合,來實現對流程執行的控制。
public class CustomProcessEngineConfiguration extends StandaloneProcessEngineConfiguration {
@Override
public EventDispatcher getEventDispatcher() {
if (getCustomEventDispatchers().isEmpty()) {
return super.getEventDispatcher();
} else {
EventDispatcherImpl eventDispatcher = new EventDispatcherImpl(getClock(), getExecutionListeners(), getTaskListeners(),
createEventListenerGroups(), getCustomEventDispatchers());
eventDispatcher.setAsyncExecutor(asyncExecutor);
return eventDispatcher;
}
}
protected Map<String, EventDispatcher> getCustomEventDispatchers() {
return customEventDispatchers;
}
}
EventDispatcher dispatcher = ((ProcessEngineImpl) processEngine).getProcessEngineConfiguration().getEventDispatcher();
List<EventDispatcher> eventDispatchers = new ArrayList();
eventDispatchers.add(dispatcher);
CustomProcessEngineConfiguration config = new CustomProcessEngineConfiguration();
config.setCustomEventDispatchers(eventDispatchers);
ProcessEngine engine = config.buildProcessEngine();
七、 資料庫鎖定機制
在多用戶環境下,為了防止並發問題,需要使用特殊技術來控制數據訪問,例如:樂觀鎖和悲觀鎖。Flowable引擎通過使用基於文件鎖的樂觀鎖機制來管理實例訪問,這種機制可以確保數據的一致性,同時也保證了較高的並發性和可擴展性。
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="processSessionFactory" class="org.apache.ibatis.session.defaults.DefaultSqlSessionFactory">
<constructor-arg ref="processDataSource"/>
<property name="configuration" ref="processConfiguration"/>
</bean>
<bean id="processConfiguration" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.flowable.engine.mappers" />
<property name="processDataSource" ref="processDataSource" />
<property name="processSessionFactory" ref="processSessionFactory" />
<property name="sqlSessionFactoryBeanName" value="processSessionFactory" />
</bean>
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249048.html