Activiti6概述
Activiti 是由 jBPM 的創建者 Tom Baeyens 離開 JBoss 之後建立的項目,構建在開發 jBPM 版本 1 到 4 時積累的多年經驗的基礎之上,旨在創建下一代的 BPM 解決方案。
Activiti是一個開源的工作流引擎,它實現了BPMN 2.0規範,可以發佈設計好的流程定義,並通過api進行流程調度。
Activiti 作爲一個遵從 Apache 許可的工作流和業務流程管理開源平臺,其核心是基於Java的超快速、超穩定的 BPMN2.0 流程引擎,強調流程服務的可嵌入性和可擴展性,同時更加強調面向業務人員。
Activiti 流程引擎重點關注在系統開發的易用性和輕量性上。每一項 BPM 業務功能 Activiti 流程引擎都以服務的形式提供給開發人員。通過使用這些服務,開發人員能夠構建出功能豐富、輕便且高效的 BPM 應用程序。
Activiti是一個針對企業用戶、開發人員、系統管理員的輕量級工作流業務管理平臺,其核心是使用Java開發的快速、穩定的BPMN e 2.0流程引擎。Activiti是在ApacheV2許可下發布的,可以運行在任何類型的Java程序中,例如服務器、集羣、雲服務等。Activiti可以完美地與Spring集成。同時,基於簡約思想的設計使Activiti非常輕量級。
Activiti的特點
1)數據持久化
Activiti的設計思想是簡潔、快速。有過應用開發經驗的開發人員都知道應用的瓶頸體現在和數據庫交換數據的過程中,針對這一點Activiti選擇了使MyBatis,從而可以通過最優的SQL語句執行Command,僅憑如此就能讓引擎在速度上保持最高的性能。
2)流程設計器
在jBPM4時代有專門的Eclipse插件可以用來設計jPDL,同樣Activiti團隊也專門設計了用來設計BPMN 2.0規範的流程謾計器-Eclipse Designer。此外還有Signavio公司爲Activiti定製的基於Web的Activiti Modeler流程設計器。喜歡用IDEA的,IDEA也有actiBPM插件支持。
3)原生支持Spring
Activiti原生支持Spring,這一點對企業應用來說尤爲重要:可以很輕鬆地進行Spring集成,非常方便管理事務和解析表達式( Expression)。
4)分離運行時與歷史數據
Activiti繼承自jBPM4,在表結構設計方面也遵循運行時與歷史數據的分離,這樣的設計可以快速讀取運行時數據,僅當需要查詢歷史數據時再從專門的歷史數據表中讀取。這種設計方式可以大幅提高數據的存取效率,尤其是當數據日積月累時依然能夠快速反應。
提出問題
上面我們簡單的介紹了一下activiti,大家可能用過或者沒有使用過activiti,當我們業務中需要滿足當一個狀態在規定時間內沒有到下一個狀態時就認定這個狀態超時條件時,大家都是怎麼實現的呢,下面我們我來給大家介紹一種方法
分析問題
通過對activiti的瞭解可以知道,activiti存在時間邊界事件,可以通過讓一個操作定時進行到下一個操作,那麼可不可以也存在超時呢?下面我們來看看能否實現超時監控處理。
解決問題
首先我們訪問http://localhost:8080/activiti-app/#/login 輸入賬號密碼之後登陸
進入之後點擊Kickstart App
然後我們直接創建一個bpmn
取好名稱和key
之後畫好我們的流程圖
最後不要忘記設置超時時間(我這裏設置的是1秒)
然後我們保存,生成配置文件,將配置文件後綴名修改爲.bpmn之後通過配置文件部署activiti
下面我們貼出測試代碼
Deployment deployment = repositoryService.createDeployment() // 創建部署
.addClasspathResource("testdemo.bpmn") // 加載流程資源文件
.name("test") //
.deploy(); // 部署
System.out.println("流程部署ID:" + deployment.getId());
System.out.println("流程部署Name:" + deployment.getName());
MyTaskQuery myTaskQuery1 = new MyTaskQuery();
myTaskQuery1.setBpmProcessId("testdemo");
pi = runtimeService.startProcessInstanceByKey("processtestdemo"); // 流程定義表的KEY字段值
List<Task> tasks2 =taskService.createTaskQuery().processInstanceId(pi.getProcessInstanceId()).list();
System.out.println("流程實例ID:" + pi.getId());
System.out.println("流程定義ID:" + pi.getProcessDefinitionId());
myTaskQuery1.setProcessInstanceId(pi.getProcessInstanceId());
// try {
// Thread.sleep(1000 * 10);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
List<Task> tasks3 = taskService.createTaskQuery().processInstanceId(pi.getProcessInstanceId()).list();
activitiService.propel(myTaskQuery1);
List<Task> tasks5 = taskService.createTaskQuery().processInstanceId(pi.getProcessInstanceId()).list();
activitiService.propel(myTaskQuery1);
但是隻有這樣運行項目,發現並沒有效果,那麼我們還需要做什麼呢?我們還需要編寫一個監視器
public class JobEventListener implements ActivitiEventListener {
private static final Logger LOGGER = LoggerFactory.getLogger(JobEventListener.class);
@Override
public void onEvent(ActivitiEvent activitiEvent) {
ActivitiEventType eventType = activitiEvent.getType();
String name = eventType.name();
if (name.equals("TIMER_FIRED")){
System.out.println("=================================超時了==================================");
// System.out.println("監聽到job事件 {} \t {}",eventType,activitiEvent.getProcessInstanceId());
LOGGER.info("監聽到job事件 {} \t {}",eventType,activitiEvent.getProcessInstanceId());
}
}
@Override
public boolean isFailOnException() {
return false;
}
}
現在監視器寫好了,心急的小夥伴覺得這下子一定可以了吧,答案是否定的,我們還需要將監視器配置到spring配置文件中
<property name="eventListeners">
<list>
<bean class="com.jtexplorer.filter.JobEventListener"/>
</list>
</property>
好了現在監視器配置好了,大家覺得一定可以了吧,但是測試的時候依然發現無法做到超時監控,那麼問題在哪呢?重點來了,也是我用了好久才解決的一個問題,在百度裏有的說是還需要加一個標籤激活job
<property name="jobExecutorActivate" value="true" />
但是我這裏加上這個標籤是報錯的,因此找了好久都沒有解決這個問題,最後終於找到了解決辦法,將這個標籤換成
<property name="asyncExecutorActivate" value="true" />
當換成這個標籤的時候,我也是報着試試的態度,但是當我測試的時候,出乎意料的成功了
我們發現斷點成功的進入了,控制檯也成功的打印出了信息
總結
其實超時處理並不是很麻煩,爲什麼一直無法實現,不知道大家遇到的都是什麼問題,我遇到的就是asyncExecutorActivate這個標籤沒有配置,通過各種查詢資料也沒有查到使用這個標籤的樣例,可能很多人遇到了和我一樣的問題,也在苦苦困擾,希望這篇文章可以給大家解困問題提供一點靈感和思路。