JBPM5的一些概念

 

人工任務分三部分
1.運行一項任務服務器,不僅啓動了TaskServer,同時還加載瞭如羣組,用戶等數據。
2.啓動一個流程實例,這個類的功能是啓動一個流程實例。
3.人工處理某一個流程,獲得某個User的任務列表,並執行某項任務。

1 taskserver 是一個獨立服務器,用於解決human task,http://hi.baidu.com/%CB%A7%D0%A1%B7%B2/blog/item/0ac709c80040063fbe09e65c.html 請看這篇文章

2 jbpm-console-server 僅僅把它當做一個web控制檯,可以啓動流程,關閉流程等。所有它能提供的功能我想可以自己利用jbpm5的api做出來,高手可以基於它做出自己的流程執行監視系統

初次嘗試JBPM5_寫給新手[User Task]: http://hi.baidu.com/wwwwcf/item/fd2ea02c9aa7f3d60e37f95b

2.1. 創建知識庫
Java代碼 複製代碼 收藏代碼
  1. KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();   
  2. kbuilder.add( ResourceFactory.newClassPathResource("MyProcess.bpmn2"),   
  3. ResourceType.BPMN2 );   
  4. KnowledgeBase kbase = kbuilder.newKnowledgeBase();  
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newClassPathResource("MyProcess.bpmn2"),
ResourceType.BPMN2 );
KnowledgeBase kbase = kbuilder.newKnowledgeBase();

2.2. 創建會話啓動流程
流程啓動需要顯式調用 startProcess 方法。
Java代碼 複製代碼 收藏代碼
  1. StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();   
  2. ksession.startProcess("com.sample.hello");  
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
ksession.startProcess("com.sample.hello");

參數 com.sample.hello 代表流程 ID。
startProcess(String processId, Map parameters) 方法的 Map 參數可傳入額外的參數,這些參數是鍵值對。注意這些參數將被複制到流程實例,作爲流程的頂級變量。頂級變量是指變量的作用或是頂級的。

2.3. 結點類型的細節解釋
流程有如下屬性:
ID: 惟一
NAME: 顯示名稱
VERSION: 版本
Package: 命名空間
Variables: 變量,用於傳遞數據
Swimlanes: 泳道(專用通道),指定執行人工任務的 actor
Connection Layout 連接佈局
Manual :人工
Shortest path :最短路徑
Manhattan:曼哈頓

BMPN 支持結點類型如下:
開始事件與結束事件: 開始事件與結束事件, 一個流程必須有一個開始事件,一個或多個結束事件。結束事件的 Terminate 如果爲TRUE,那麼將結束整個流程,否則若有多個結束事件只會結束對應結束事件的路徑。

Rule Task 代表需要執行一組規則集。規則定義在多個分離的文件中,格式要求爲 Drools rule format。規則可以成爲標準規則流組的一部分通過在頭部使用 ruleflow-group 屬性。ruleflow-group 的執行可認爲是一個隊列。新來的必須等前面的執行完纔會執行。

Diverging Gateway 分支結點,一進多出。Gateway 不好翻譯,所以省略。
AND parallel 與,並行,兩個都要滿足(同步)
XOR or exclusive 異或,排斥,只選擇其中一個
OR or inclusive 或,包含,至少只要有一個滿足即可(不同步)

Converging Gateway 合併結點,多進一出。
AND parallel 與,並行,兩個都要滿足(同步)
XOR or exclusive 異或,排斥,只選擇其中一個

Reusable Sub-Process 可複用子流程
Wait for completion 等待完成
On-entry and on-exit actions:綁定入口與出品 action.
Parameter in/out mapping: in 表示輸入參數 out 表示輸入參數和返回,只有當 Wait for completion 爲 true 時,out 纔可以使用。

Script Task 代表一個可執行的腳本。支持 Java , MVEL 方言。腳本綁定到 Action. Action: 綁定的 Action.

Timer Event 定時器事件,
Timer delay 延遲時間 ms

Error Event 異常事件
FaultName 異常處理器名
FaultVariable 異常變量

Message Event 消息事件, 沒有輸入
EventType 監聽事件類型
VariableName 事件數據
Scope internal 流程內部事件 external 外部事件

User Task 用戶任務(人工任務)
ActorId 責任人,多個人用逗號“,”分隔
GroupId 組,多個組用逗號“,”分隔
Skippable 表示這個任務是否可忽略,即不執行就結束。
Swimlane 泳道
On.entry /on-exit actions: 綁定入口、出口 Action
Parameter mapping 傳入參數
Result mapping 返回結果
Content: 任務數據
Sub-Process 子流程
Multiple Instances 多實例子流程,特殊的子流程,允許執行多次
Service Task(Work Item node)代表一個抽象的任務。可通過它擴展任務。
Additional parameters 擴展參數定義。
Data 變量,頂級、子級,繼承樹
約束:包括代碼約束和規則約束

Actions: Action 可以訪問全局,流程變量,知識庫上下文預定義變量,訪問運行時,啓動流程,分發事件,插入數據。

Events: 事件類型 - 事件監聽(消息事件) - 事件處理(action)
事件分發: 內部事件 流程管理
外部事件: action

Timers: 定時器

更新流程
Java代碼 複製代碼 收藏代碼
  1. // create the session and start the process "com.sample.process"   
  2. KnowledgeBuilder kbuilder = ...   
  3. StatefulKnowledgeSession ksession = ...   
  4. ProcessInstance processInstance = ksession.startProcess("com.sample.process");   
  5. // add a new version of the process "com.sample.process2"   
  6. kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();   
  7. kbuilder.add(..., ResourceType.BPMN2);   
  8. kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());   
  9. // migrate process instance to new version   
  10. Map<String, Long> mapping = new HashMap<String, Long>();   
  11. // top level node 2 is mapped to a new node with id 3   
  12. mapping.put("2", 3L);   
  13. // node 2, which is part of composite node 5, is mapped to a new node with id 4   
  14. mapping.put("5.2", 4L);   
  15. WorkflowProcessInstanceUpgrader.upgradeProcessInstance(   
  16. ksession, processInstance.getId(),"com.sample.process2", mapping);  
// create the session and start the process "com.sample.process"
KnowledgeBuilder kbuilder = ...
StatefulKnowledgeSession ksession = ...
ProcessInstance processInstance = ksession.startProcess("com.sample.process");
// add a new version of the process "com.sample.process2"
kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(..., ResourceType.BPMN2);
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
// migrate process instance to new version
Map<String, Long> mapping = new HashMap<String, Long>();
// top level node 2 is mapped to a new node with id 3
mapping.put("2", 3L);
// node 2, which is part of composite node 5, is mapped to a new node with id 4
mapping.put("5.2", 4L);
WorkflowProcessInstanceUpgrader.upgradeProcessInstance(
ksession, processInstance.getId(),"com.sample.process2", mapping);


人工任務/用戶服務
流程包含的任務由人工角色來執行。用戶任務代表一個有人工角色來執行的最初任務。它應該有一個輸入連接和一個輸出鏈接。用戶任務可以被用來和 Swimlance 泳道相結合來給同一個角色分配多個人工任務。在 human tasks 章節可以查到更多的細節。一個用戶服務就是一個服務節點特有類型。

人工任務規範 http://download.boulder.ibm.com/ibmdl/pub/software/dw/specs/ws-bpel4people/WS-HumanTask_v1.pdf
jBPM5 使用 UserTask 結點表示人工任務(需要與 actor 交互的任務)。
UserTask 任務結點支持定義任務類型、 actors 和任務關聯的數據。通過 Task Service 可管理 UserTask。
爲了使用人工任務,你必須定義 UserTask 結點。一個 UserTask 表示一個需要 actor 執行的自動化任務。人工任務其實可以簡單認爲是任何類型的外部服務。外部服務需要被調用,可看成特殊類型的 work item 實現。
人工任務惟一的特色是支持泳道來簡化給用戶分配任務。
UserTask 結點屬性:
* Id: 結點惟一標識
* Name: 結點名稱
* TaskName:  任務名稱
* Priority:  優先級(整數)
* Comment:  任務註釋
* ActorId: actor, 多個使用逗號","分隔
* Skippable: 任務可跳過(不執行就結束)
* Content: 任務關聯的數據
* Swimlane:  泳道(專用通道),可以簡化分配多個人工任務給同一個actor
* Wait for completion: 是否等待人工任務執行完成,若爲 False,則創建完人工任務後繼續流程。
* On-entry and on-exit actions: 綁定入口、出品事件處理器-action
* Parameter mapping: 參數
* Result mapping: 結果
* Timers: 定時器
* ParentId: 父人工服務 ID


人工任務生命週期
當一個流程實例的人工任務結點被觸發,人工任務實例將被創建。當創建完成後,人工任務進入 Created 狀態。
當人工任務的 Wait for completion 屬性爲 False 時,流程會立即繼續執行,否則要等待任務完成或終止。

進入 Created 狀態,任務將顯示所有負責執行的 actors。等待他們來獲取任務。一旦有一個 actor 獲取任務,任務進入 Reserved 狀態。用戶決定開始執行任務,此時任務進入 InProgress 狀態。任務開始執行,執行完成後,用戶必須完成任務。此時用戶進入 Completed 狀態。用戶也可以決定任務已經失敗,此時任務進入 Failed 狀態。
上面介紹的正常的生命週期,其它包括:
Delegating /forwarding 任務, 分配任務給另外一個 actor 來處理
Revoking 回滾任務
Temporarly suspending and resuming 臨時掛起或繼續任務
Stopping a task in progress 停止正在執行的任務
Skipping 跳過(不執行)

腳本任務
代表一個腳本在流程中應該被執行。一個腳本任務應該有一個輸入鏈接和一個輸出鏈接。相關聯的動作應該指定什麼要被執行,還有編碼動作的方言,和正在的動作代碼。這段代碼可以訪問任何變量和全局參數。這還有一個提前定義的變量 kcontext 從ProcessContext 對象引入。在流程中,當一個腳本任務被訪問時,它將會執行動作,然後繼續到下一個節點。
注意:你可以在腳本代碼內部寫任何有效地 java 代碼。這基本上允許你在腳本代碼內做
任何事。然而,這裏也有一些警告:
•當你試着去創建一個高級的業務流程時,你應該確定能夠被業務用戶所理解,在流程內部避免低級的執行細節將會是明智的。包括在腳本任務的內部。腳本任務仍然可以用來快速處理變量等。但是像服務任務等其他的任務能夠被用來在高級方式中建模更加複雜的行爲。
•腳本應該是 immediate(這裏不知道翻譯成什麼好),他們使用引擎線程來執行腳本。腳本的執行可能會花一些時間,它的執行可能會被以異步的服務任務方式來進行。
•你應該儘量避免通過腳本節點和外部服務相關聯。這不僅僅違法了前面兩個的警告,它將會影響除了 knowledge 引擎之外的其他外部服務,這將會產生問題,特別是在持久化和轉換時。總的來說,使用服務任務來和外部的服務相關聯是相當明智的
•腳本不應該拋出異常。運行時異常應該被捕獲,例如在腳本內部進行管理,或者轉換成信號,或者產生的錯誤能夠在流程內部處理。

服務任務
代表一個在流程中應該被執行的工作單元。在流程引擎外部執行的所有的工作都應該使用服務任務來描繪或執行。BPMN 2.0 已經提前定義了不同的服務類型,例如發送郵件服務,消息日誌等等。用戶可以定義特有域的服務或工作條目,使用唯一的名稱並定義所用到的參數,最終的輸出和工作類型相關。查看 domain-specific processes 章節你可以獲得更多的細節解釋和在你的流程中怎樣去定義和使用工作條目的說明。

指南里面的一些概念
--------------------------------------------------------------------------------------
knowledge base
一個 knowledge base 能夠通過會話來共享並且通常只需要在應用啓動時創建一次。knowledge base 能夠動態的更改。
jBPM 應該被用來創建一個 knowledge base,其包含你的流程定義,再就是創建一個用來啓動新的流程實例、單獨存在的,或者註冊監聽器等等的會話。
jBPM 允許你先創建一個 knowledge base。這個 knowledge base 應該包含你所有的流程定義,就是需要被會話執行的流程。創建一個 knowledge base,先用 knowledge builder來連接不同資源的流程,然後從 builder 創建一個新的 knowledge base。
Java代碼 複製代碼 收藏代碼
  1. KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();   
  2. kbuilder.add(ResourceFactory.newClassPathResource("MyProcess.bpmn"),   
  3. ResourceType.BPMN2);   
  4. KnowledgeBase kbase = kbuilder.newKnowledgeBase();  
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("MyProcess.bpmn"),
ResourceType.BPMN2);
KnowledgeBase kbase = kbuilder.newKnowledgeBase();


流程知識庫
如果你想在你的應用中啓動多個業務流程,特別是你想要有能力動態更新他們,一個流程知識庫將是你的 BPM 體系的重要組成部分。流程知識庫是用來存儲和管理你的業務流程。因爲他們不能夠作爲你應用的一部分,因爲他們有自己的生命週期,意味着你能夠動態的更新業務流程, 不能改變應用代碼。
注意:流程知識庫不僅僅是一個用來存儲你流程定義的數據。它幾乎扮演着源代碼管理系統、內容管理系統、協作組件、開發和測試環境的結合體的角色。

會話
這個會話用來和流程引擎聯繫。會話需要有一個從 knowledge base 引用,包含了所有相關流程定義的引用。這個 knowledge base是用來在任何有必要的時候來查看流程的定義。要去創建一個會話,你首先需要去創建一個 knowledge base,鏈接到所有的必需已定義的流程,然後初始化一個會話。
一旦你裝載了 knowledge base,你應該創建一個會話來和引擎結合。然後會話就能夠被來啓動一個流程或單獨的事件。下面的代碼片段展現了基於先前創建的 knowledgebase 來創建一個會話是多麼的容易,並可以通過 id 來啓動流程。
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
ProcessInstance processInstance = ksession.startProcess("com.sample.MyProcess");

事件
會話提供了監聽器的註冊和刪除的方法,一個流程事件監聽器可以被用來監聽和流程相關的事件,比如開始或完成一個流程,進入或離開一個節點等等。

拋出錯誤事件
一個錯誤事件可以在流程中發出一個異常信號。它應該有一個輸入連接而沒有輸出鏈接。在流程中當一個錯誤事件發生的時候,它將拋出一個錯誤並給出錯誤名稱。而流程將會搜索能夠使得解決這種錯誤的處理方法。如果沒有錯誤處理被發現,流程實例將會被終止。

獲取定時器事件
代表着在給出一段時間後定時器會引發一次或多次。一個計時器事件應該有一個輸入連接和一個輸出鏈接。計時器延遲指定了應該等待多長時間之後第一時間引發。在流程中,當一個計時器事件發生的時候,流程將會和計時器相關聯。如果計時器節點被取消,那麼計時器也將被取消。

獲取信號事件
在流程的執行當中,一個信號事件可以用來作爲對內部或外部事件的迴應。它指定了預期事件的類型。無論這個事件類型什麼時候被探測到,與它相連接的事件節點都將被觸發。

腳本任務 代表一個腳本在流程中應該被執行。

服務任務
代表一個在流程中應該被執行的工作單元。在流程引擎外部執行的所有的工作都應該使用服務任務來描繪或執行。BPMN 2.0 已經提前定義了不同的服務類型,例如發送郵件服務,消息日誌等等。服務任務能夠通過映射變量到流出參數來傳遞流程變量的值到外部(或者另一流程實例)

用戶服務
流程包含的任務由人工角色來執行。用戶任務代表一個有人工角色來執行的最初任務。

重用的子流程 代表當前流程中的另一個流程的調用。

業務規則任務
代表一組規則需要被“evaluated”(這裏不知道怎麼翻譯好)。當節點被鏈接到時,規則會被“evaluated”。一個規則任務應該有一個進入鏈接和一個退出鏈接。

嵌入子流程
一個子流程就是一個能夠包含其他節點的節點,事實上講就是一個節點容器。這不僅僅允許在這樣一個子流程節點嵌入流程的一部分,而且可以添加容器內所有節點都可以訪問的變量。一個子流程應該有一個進入鏈接和一個退出鏈接。它也應該包含一個開始節點,這個開始節點定義了在進入子流程時應該從哪裏啓動。它當然也應該包含一個或多個結束事件。
注意:如果你在子流程內部使用了終止節點,你將終止高一級的流程實例,而不僅僅是子流程,所有,你應該在子流程內使用非終止節點。在子流程中如果沒有活動節點存在,那麼這個子流程將會結束。

多實例子流程
一個多實例子流程是一個指定類型的子流程,它允許你多次執行所包含的流程片段,每一個元素都會在集合當中。一個多個實例子流程應該有一個進入鏈接和一個退出鏈接。在繼續執行之前,要等嵌入的流程片段中給出的集合中每一個元素都被完成才能繼續。

分支網關 允許你在你的流程中創建一個分支。一個分支網關應該有一個進入鏈接和兩個或多個流出鏈接。

合併網關 允許你同步多個分支。一個合併網關應該有兩個或多個進入鏈接和一個流出鏈接。

爲了能夠執行你應用中的流程,你需要做兩件事:(1)你需要創建一個 Knowledge Base,要包含一個流程定義;(2)你需要通過創建一個 session來啓動流程,並通過 session 來和流程引擎鏈接。
1. 創建一個 Knowledge Base:你需要有一個可用的流程,然後添加流程到 KnowledgeBase:
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newClassPathResource("MyProcess.bpmn2"),
ResourceType.BPMN2 );
在添加所有的流程到 builder 之後,你可以像下面一樣創建一個新的 Knowledge base:
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
2. 啓動一個流程:啓動一個指定的流程,你需要用你的的 session 去調用 startProcess方法並傳遞你想要啓動的流程的 id。
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
ksession.startProcess("com.sample.hello");

數據
雖然流程表關注於指定的流程控制流向,但是從數據的角度來查看流程一般也是很有必要的。一個流程的執行,數據能夠獲得、存儲、傳遞和使用。

約束
流程可以用在你流程的各種地方。例如在一個分離網關中。jBPM 支持兩種類型的約束:
•Code constraint:代碼約束就是布爾表達,直接判斷他們什麼時候到達。我們現在對於表達這種代碼約束支持兩種方言:Java 和 MEVL。Java 和 MVEL 代碼約束都可以直接的訪問在流程中定義的全局變量和變量。
•規則約束等同於正常的 Drools rule 條件。用 Drools Rule 語言的語法來表達可能複雜的
約束。就像其他的規則一樣,這些規則能夠在工作內存中引用數據。當然也可以直接引
用全局變量。

動作腳本
動作腳本可以以不同的方式使用:
•在腳本任務中使用
•作爲一個進入或退出動作

事件
流程應該響應那些不是被流程引擎直接請求的事件。明確的描繪在流程中的事件,允許流程作者去指定對於這種事件流程應該做出如何反應。
事件有一個類型並可能有和他們相關的數據。用戶可以自由的定義他們自己的事件類型和他們相關的數據。
一個流程能夠通過使用 Message Event 來指定對事件應該如何響應。一個事件節點需要去指定事件的類型。它也能夠定義變量的名稱,用來接收和事件相關的數據。這就允許在流程中的併發節點去訪問事件數據並基於這些數據採取響應的動作。

計時器
計時器是在觸發之前等待提起定義的時間量,它允許執行一次或重複執行。計時器能夠被用來在一個特定週期之後觸發特定的邏輯,或者在特定的間隔內重複某些動作。

更新流程
在經過一段之後,流程可以要優化,例如由於流程自身需要改進,又或者因爲需求的改變。實際上,你不能夠真正的升級一個流程,你僅僅能夠配置一個新版本的流程,舊版本的流程將仍然存在。因爲已經存在的流程實例可能仍然需要定義好的流程。所以新的流程應該有一個不同的 id,但是名稱可以相同。你可以使用版本參數來顯示一個流程被升級了。

持久化
配置 jBPM 引擎在任何必要的時候來保存引擎的狀態。最簡單的方式就是使用 JPAKnowledgeService 來創建你的 knowledge session,基於 knowledge base,一個 knowledge session 和一個環境。環境需要包含從你的 Entity Manager Factory 來索引。
Java代碼 複製代碼 收藏代碼
  1. // create the entity manager factory and register it in the environment   
  2. EntityManagerFactory emf =   
  3. Persistence.createEntityManagerFactory( "org.jbpm.persistence.jpa" );   
  4. Environment env = KnowledgeBaseFactory.newEnvironment();   
  5. env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );   
  6. // create a new knowledge session that uses JPA to store the runtime state   
  7. StatefulKnowledgeSession ksession =   
  8. JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );   
  9. int sessionId = ksession.getId();   
  10. // invoke methods on your method here   
  11. ksession.startProcess( "MyProcess" );   
  12. ksession.dispose();   
  13. 你也可以使用 JPAKnowledgeService 來基於一個特定的 session id 來重新創建一個session:   
  14. // recreate the session from database using the sessionId   
  15. ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( sessionId, kbase, null,env );  
// create the entity manager factory and register it in the environment
EntityManagerFactory emf =
Persistence.createEntityManagerFactory( "org.jbpm.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
// create a new knowledge session that uses JPA to store the runtime state
StatefulKnowledgeSession ksession =
JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
int sessionId = ksession.getId();
// invoke methods on your method here
ksession.startProcess( "MyProcess" );
ksession.dispose();
你也可以使用 JPAKnowledgeService 來基於一個特定的 session id 來重新創建一個session:
// recreate the session from database using the sessionId
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( sessionId, kbase, null,env );

注意:我們只保存流程實例在之後的點需要繼續執行的最小限度的狀態。這就意味着它不會保存已經執行的節點的信息,如果這些節點再也不會用的,又或者已經完成的實例,或者中止並從數據庫刪除的情況都不會保存。

流程定義
流程定義文件通常是使用 XML 格式編寫的。在開發中,這些文件能夠很容易的存儲在文件系統中。無論你想什麼時候使你的 knowledge 訪問產品中的一個或多個引擎,我們建議使用 knowledge repository(知識庫),知識庫就是集中你的 knowledge 到一個或多個知識庫中。
Guvnor 是 Drools 子項目所提供的工具。它由一個存儲各種不同類型的 knowledge、流程定義、rules、對象模型的 repository 知識庫組成的。使用 WebDAV 或一個 knowledge代理都很容易檢索 knowledge,當專家一個 knowledge base 的時候,knowledge 代理將會從 Guvnor 下載信息,並提供了一個 web 應用來允許業務用例來查看並有可能在knowledge repository 中更新信息。

歷史日誌
很多情況下,歷史日誌用來存儲流程實例執行相關的信息,以至於這些信息在之後可以用來覈實一個指定的流程實例的動作執行的內容,或者用來監視和分析一個特定流程的效率。存儲歷史信息到運行時的數據庫不是一個很好的注意,這有可能造成運行時數據的不斷增加,並且監視和分析查詢會影響運行時引擎的執行。這就是爲什麼關於流程實例執行的歷史信息要分開存儲了。

將流程事件存儲到數據庫
jbpm-bam 模塊包含了一個事件監聽器,這個監聽器使用 JPA 或者 Hibernate 來直接存儲流程相關信息。數據庫包含兩個表,一個用來存儲流程實例信息,一個用來存儲節點實例信息。
1. ProcessInstanceLog:這個表包括所有流程實例的 id、流程 id、開始時間和結束時間。
2. NodeInstanceLog:這個表包含節點在每個流程實例中實際執行的節點的更多詳細信息。無論什麼時候,節點實例都是從它的進入鏈接中進入,從它的推出鏈接中推出,這些信息都存儲在這個表中。存儲流程實例的 id,正在執行的流程實例的流程 id,節點實例的 id,和相應的節點 id,並且事件的類型和事件的狀態都也會被存儲。
爲了記錄歷史信息到數據庫當中,你需要在你的 session 中註冊一個記錄器,像下面所示:
Java代碼 複製代碼 收藏代碼
  1. StatefulKnowledgeSession ksession = ...;   
  2. JPAWorkingMemoryDbLogger logger = new JPAWorkingMemoryDbLogger(ksession);   
  3. // invoke methods one your session here   
  4. logger.dispose();  
StatefulKnowledgeSession ksession = ...;
JPAWorkingMemoryDbLogger logger = new JPAWorkingMemoryDbLogger(ksession);
// invoke methods one your session here
logger.dispose();

注意:
這個記錄器和其他的核查記錄器一樣,這就意味着你能夠添加一個或多個過濾器,通過調用 addFilter 方法來確保只有相關的信息被存儲在數據庫中。信息只能被所有的過濾器訪問。你應該在不再需要記錄的時候去除記錄器。
編輯 persistence.xml 文件來指定存儲信息的數據庫,這個文件也包括審覈日誌的類型。


任務生命週期
無論一個任務什麼時候被創建,它都是從“Created”開始。
它會自動轉換到“Ready”狀態,在這一點的時候,任務將會被展示在所有參與者的任務列表上,並允許參與者執行任務。這裏是正在等待這些參與者中一個來認領任務,這就表示他正在執行任務。
一旦一個用戶認領了一個任務,狀態就會更改爲“Rserved”。注意:一個任務僅僅有一個潛在的參與者,在自動分配給參與者之前就創建了任務。
任務認領任務之後,用戶能夠在某一點開始執行任務,這種情況下任務的狀態會被更改爲“Inprigress”。
最後,一旦任務完成,用戶必須完成任務,這種情況下狀態被更改爲“Completed”。
如果任務沒有完成,用戶也顯示使用了錯誤的響應,那麼執着情況下狀態就被更改爲“Failed”。

特定領域
特定的領域擴展就是簡單的在一個特定領域的應用中開發。這個指南描述了開發特定領域的流程的第一步。注意:你不需要是一個 jBPM 專家就能夠定義你自己的特定領域節點,這應該是一個綜合的代碼,只要是有一些 jBPM 開發的經驗就能夠自己完成。
特定領域語言的目標是針對於特定應用領域,因此能夠提供和用戶嘗試解決的問題緊緊相關的構造。這就使得流程更容易理解。我們將展現給你如何定義特定領域工作條目,這代表需要被執行的工作原子單元。這些服務接待將指定在發佈的行爲流程的上下文中將有執行測工作,並指出了在高一級需要執行的內容並隱藏了實現細節。

業務活動監視器
你需要積極的監控你的流程來確保你能夠察覺到任何的異常,並對不期望的事件儘可能快的的做出反應。業務活動監視器和你的流程監視器與干預選項有直接的關係,甚至可能自動的,基於這些事件來分析。
jBPM 允許用戶通過流程引擎並基於事件的產生來定義報告,並且使用複雜事件流程規則可能直接的介入到特定的情形中,就像下面兩部分介紹的一樣。未來 jBPM 平臺的發佈將包括對所有業務活動監視器需求的支持,包括能夠被用來和運行中流程引擎交互,查看它的狀態,產生報告等等的基於 web 的應用。
發佈了276 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章