同步節(jié)點(diǎn)和異步節(jié)點(diǎn)
service task和 user task中都會(huì)有一個(gè)Asynchronous的復(fù)選框,這個(gè)Async有什么區(qū)別呢?
參考Synchronous vs. Asynchronous Service Invocations - BPMN Service Task,可以理解為,
- 同步節(jié)點(diǎn):類似同步調(diào)用,調(diào)用者都是流程引擎,服務(wù)提供方是userTask, serviceTask,同步節(jié)點(diǎn)是流程引擎在執(zhí)行Task時(shí),一直等待Task執(zhí)行完才返回。
- 異步節(jié)點(diǎn):流程引擎將異步節(jié)點(diǎn)的請求都構(gòu)造出來,放到一個(gè)待執(zhí)行隊(duì)列中,由
request Processor執(zhí)行,執(zhí)行完之后將結(jié)果通過回調(diào)的方式返回給流程引擎。
如果某一個(gè)節(jié)點(diǎn),依賴于上一個(gè)節(jié)點(diǎn)的返回結(jié)果,那這個(gè)節(jié)點(diǎn)需要是同步節(jié)點(diǎn),否則可以是異步節(jié)點(diǎn)。
以下是2017.12.27更新
對于serviceTask而言,是否設(shè)置asynchronous并不是看“是否依賴于上個(gè)節(jié)點(diǎn)的返回結(jié)果”(上邊刪除線標(biāo)記的部分),而是要看這個(gè)節(jié)點(diǎn)是否要跟上一個(gè)節(jié)點(diǎn)在同一個(gè)事務(wù)中。
事務(wù)(transaction)可以保證在某一個(gè)activity發(fā)生異常后可以回滾。activiti的很多對于DB的操作并不會(huì)直接寫庫,而是在遇到wait status節(jié)點(diǎn)后才submit。
那什么才是wait status節(jié)點(diǎn)呢,手冊給出說明,等待狀態(tài)就是讓流程"過一會(huì)之后"再執(zhí)行的節(jié)點(diǎn),遇到這類節(jié)點(diǎn),activiti流程會(huì)把當(dāng)前執(zhí)行結(jié)果持久化,并等待流程被下一次觸發(fā)。(A wait state is a task which is performed "later" which means that Activiti persists the current execution and waits to be triggered again.)。定時(shí)器Timer、異步Task節(jié)點(diǎn)都是“等待狀態(tài)”的節(jié)點(diǎn)。
也就是說,如果你設(shè)置了任務(wù)是“同步”的,則如果發(fā)生異常之后,會(huì)回滾到上一個(gè)處于“等待狀態(tài)”的節(jié)點(diǎn)處。如果設(shè)置了asynchronous,則會(huì)單獨(dú)執(zhí)行和回滾。
參考: