<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 3,  comments - 5,  trackbacks - 0

            Jbpm,他是jboss下的一個開源項目,是個基于petri net理論為基礎的工作流引擎。本文主要通過jbpm源代碼分析下jbpm引擎內核工作原理。
            Jbpm是基于微內核引擎的基礎上擴展開發出來的工作流平臺,其運行的核心包是在org.jbpm.graph下,在該包下又分有action、def、exe、log、node幾個包,jbpm內核引擎實現邏輯主要存放在def、exe這兩個包下,其他的包是基于此內核擴展出來的動作、模型和日志。
            下面我們通過一個簡單的例子來逐步的分析jbpm是如何工作的。看下面jbpm自帶演示的一個hello流程(視乎大家都喜歡從hello實現開始^_^),代碼如下:
            public void testHelloWorldProcess() {
                    ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
                    "<process-definition>" +
                    " <start-state>" +
                    " <transition to='s' />" +
                    " </start-state>" +
                    " <state name='s'>" +
                    " <transition to='end' />" +
                    " </state>" +
                    " <end-state name='end' />" +
                    "</process-definition>"
                    );

                    ProcessInstance processInstance =new ProcessInstance(processDefinition);
                    Token token = processInstance.getRootToken();
                    assertSame(processDefinition.getStartState(), token.getNode());
                    token.signal();
                    assertSame(processDefinition.getNode("s"), token.getNode());
                    token.signal();
                    assertSame(processDefinition.getNode("end"), token.getNode());
            }
            首先,我們定義個流程模板(ProcessDefinition),就是上面代碼的ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(….);這段,在括號中是jbpm定義的流程,其中包括三個環節,分別是starts-state、state和end-state。parseXmlString()方法的主要功能是解析這段xml語言返回個流程模板對象(processDefinition)。
            接著,通過流程實例類(ProcessInstance)來實例化個流程實例,通過傳進來的流程模板對象創建ProcessInstance processInstance =new ProcessInstance(processDefinition)。我們來看看new ProcessInstance(processDefinition)到底做了什么,通過查看ProcessInstance的源代碼,可以看到其中主要的一段是
            public ProcessInstance( ProcessDefinition processDefinition ) {
                //略去其他代碼
                this.processDefinition = processDefinition; //將流程模板對象付給流程實例
                this.rootToken = new Token(this); //創建跟令牌
                //略去其他代碼
            }
            我們繼續跟進Token這個類
            public Token(ProcessInstance processInstance) {
                //主要一句如下
                this.node = processInstance.getProcessDefinition().getStartState();
            }
            這樣就實現了令牌綁定到開始節點。至此,一個流程實例就創建起來了,并且該流程實例走到了開始節點,即令牌所處的位置。
            我們接著往下走token.signal()
            public void signal() {
                    signal(node.getDefaultLeavingTransition(), new ExecutionContext(this));
                    //這里的getDefaultLeavingTransition()如果有多條路徑,則去第一條路徑
              }
            void signal(Transition transition, ExecutionContext executionContext) {
                //省略其他代碼
                node.leave(executionContext, transition);
                //省略其他代碼
            }
            這里的node就是剛才令牌所在的開始節點,我們來看看jbpm是如何將令牌從開始節點移到下個節點的。
            public void leave(ExecutionContext executionContext, Transition transition) {
                Token token = executionContext.getToken();
                token.setNode(this);//此時令牌還在開始節點
                executionContext.setTransition(transition);
                //略去部分代碼
            executionContext.setTransitionSource(this);
            transition.take(executionContext);//實現令牌的轉移
            }
            我們來看看transition.take(..)方法做了什么
            public void take(ExecutionContext executionContext) {
                //略去部分代碼
                to.enter(executionContext);//離開開始節點,進入到下個節點
            }
            大家可能會有點疑問,這個to節點是什么是否初始化的?其實在signal時有句node.getDefaultLeavingTransition(),這句返回Transition對象,該對象就已經初始化了to節點的對象。我們在跟進to.enter(..)
            public void enter(ExecutionContext executionContext) {
                Token token = executionContext.getToken();
                token.setNode(this);//此時令牌就到了名字為“s”的state節點
                token.setNodeEnter(new Date());
                executionContext.setTransition(null);
                executionContext.setTransitionSource(null);
                execute(executionContext);
            }
            在這段代碼中的注釋這句,真正實現了令牌從開始節點到下個節點了。
            至此,jbpm工作流引擎的內部工作原理就介紹完了,其實這就是工作流引擎最核心的部分了,就是如何從一個環節轉移到另一個環節。或許你會說“這么簡單,我馬上就可以寫一個”,其實不然,上面我們所用的例子是十分簡單的例子,其實在工作流聯盟規范中還有其他復雜的節點模型,如split,join,subflow等。不過幸運的是這些復雜的節點模型jbpm都為我們提供了他自己的默認的實現,這些節點模型都在org.jbpm.graph.node包下。jbpm引擎中很好的抽象了節點模型Node類,大部分的復雜節點模型都繼承自Node,我們也可以定制自己的節點,只要實現Node類的execute()方法即可方便的實現。其實從上面分析的代碼可以看出,Node類主要的邏輯處理是在leave()、enter()和execute()三個方法,大家可以看下ProcessState,join,fork這些節點模型是如何實現的。
    以上簡單介紹了jbpm引擎內核的工作原理,如有不對的地方還望指正。

    posted on 2008-09-16 19:28 囧囧之豬 閱讀(4204) 評論(5)  編輯  收藏 所屬分類: workflow

    FeedBack:
    # re: 【原】通過jbpm源碼分析jbpm引擎內核工作原理
    2008-09-17 00:03 | mingj
    不錯
    其實工作流引擎最難的是流轉的定義和抽象
    1. 如何將復雜的業務流程抽象成線性, 分支或合并的圖形學關系
    2. 如何提供dsl或腳本語言讓業務專家編寫工作流規則  回復  更多評論
      
    # re: 【原】通過jbpm源碼分析jbpm引擎內核工作原理
    2008-09-17 01:36 | 站長論壇
    教程真詳細,謝!  回復  更多評論
      
    # re: 【原】通過jbpm源碼分析jbpm引擎內核工作原理
    2008-09-17 09:33 | yz
    寫得好,支持一下!繼續努力  回復  更多評論
      
    # re: 【原】通過jbpm源碼分析jbpm引擎內核工作原理
    2008-09-17 14:16 | 昨夜流星
    分析的不錯,呵呵,樓主文中提到了:“jbpm引擎中很好的抽象了節點模型Node類,大部分的復雜節點模型都繼承自Node,我們也可以定制自己的節點,只要實現Node類的execute()方法即可方便的實現。”,不知道樓主能不能給個擴展的例子,感謝之至!  回復  更多評論
      
    # re: 【原】通過jbpm源碼分析jbpm引擎內核工作原理
    2012-08-13 13:57 | 我是樓主
    這段文章怎么我在哪個文檔上面看過。 不是樓主自己寫的吧? 不過的確是把jbpm的核心部分寫出來了  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2008年9月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 777成影片免费观看| 深夜a级毛片免费无码| 国产成人AV免费观看| 亚洲国产无套无码av电影| 亚洲午夜精品一区二区麻豆| 免费在线视频你懂的| 日本免费电影一区| 亚洲av永久无码天堂网| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 99久久免费精品高清特色大片| 亚洲国产另类久久久精品| a级在线观看免费| 日韩免费毛片视频| 亚洲а∨精品天堂在线| 国产乱色精品成人免费视频| jzzijzzij在线观看亚洲熟妇| 久久久久免费看黄a级试看| 啊灬啊灬别停啊灬用力啊免费看| 亚洲欧美日韩久久精品| 5g影院5g天天爽永久免费影院| 亚洲国产综合91精品麻豆| 免费无毒a网站在线观看| 亚洲精品国产高清嫩草影院| 亚洲国产成人手机在线观看| 日本一线a视频免费观看| jizz免费一区二区三区| 久久久久亚洲Av片无码v| 久久成人18免费网站| 日产国产精品亚洲系列| 久久毛片免费看一区二区三区| 亚洲国产精品福利片在线观看| 人与禽交免费网站视频| 亚洲AV无码AV男人的天堂不卡 | 一区二区三区精品高清视频免费在线播放| 手机在线毛片免费播放| 亚洲第一页在线播放| 最近的免费中文字幕视频| 日本一区二区三区免费高清在线| 亚洲精品无码久久久久sm| 国产在线观看麻豆91精品免费 | 亚洲人成人77777在线播放|