首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

jBPM 源碼深度解析:Fork 節點的並行分發與子 Token 命名機制

     編輯:Java 相關知識

Fork 角色

配合 Join 實現流程並行分支(TaskNode、State 等可同時運行)。不支援並發子流程,官方建議自定義 TokenHandler 擴展。

三種配置方式(文檔稱三種,代碼僅兩種)

  1. 無配置:自動對所有離開轉向創建子 Token。
  2. Script:運行時動態計算轉向名稱集合(返回 Collection<String>),靈活路由。注意:jPDL 未來版本可能移除 Script 支援。

核心執行流程 execute(ExecutionContext)

Token parent = context.getToken();
Collection transitionNames = (script != null) ? evalScript() : getLeavingTransitionsMap().keySet();
List forkedTokens = new ArrayList();

for (String tn : transitionNames) {
    String childName = getTokenName(parent, tn); // 命名邏輯見下
    Token child = new Token(parent, childName);
    forkedTokens.add(new ForkedToken(child, tn));
}
for (ForkedToken ft : forkedTokens) {
    leave(new ExecutionContext(ft.token), ft.leavingTransitionName); // 觸發 node-leave 事件多次
}

子 Token 命名算法 getTokenName(parent, transitionName)

  • 有轉向名且父 Token 無同名子 Token → 直接用轉向名。
  • 已存在同名 → transitionName + 2、+3... 遞增直到唯一。
  • 轉向名為 null → parent.getChildren().size() + 1(純數字)。

關鍵細節

  • ForkedToken 為內部類,僅作為 (childToken, transitionName) 元組容器。
  • node-leave 事件會觸發 N 次(N=子 Token 數),監聽器需做好冪等或上下文區分。
  • 官方 TODO:需增加「阻塞父 Token 直到 Join 喚醒」機制,防止外部 signal 干擾等待中的 Token,suspend/resume 不適合(會連帶掛起 timer/task/message)。

理解 Fork 源碼,有助於診斷並行分支異常、設計自定義 TokenHandler 實現並發子流程等高級需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved