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

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

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

    posts - 193,  comments - 520,  trackbacks - 0
            萬物生長靠太陽,兒童的生長離不開土壤、空氣和水,當然,也離不開綠壩娘的調教。應用程序也是如此,離不開數據庫連接、事務、日志、消息等,這些,共同構成了應用程序的運行期環境。
            理想中的環境是什么樣子的哩。好吧,一句話,召之即來,揮之即去,當需要某個服務時,ok,打個響指,該服務就準備好被調用了,調用完畢后也不用費心費力地擦屁股,不必老是提心吊膽有好事者追問:你擦了嗎,確定擦了?真的確定擦了?直接丟棄給環境降解處理,自然又環保,還有個好名聲叫專注領域邏輯。

    一、    運行期環境就是一個餐館
    1、    提供必要的服務
    作為一個餐館,必須有廚師做飯我吃,必須有桌子和椅子。作為運行期環境同樣如此,我要發消息,你得提供我發消息的Service,我要獲取節點任務,你得扔給我TaskService。

    2、    提供獲取這些服務的統一方式
    好吧,我不會親自到廚房告訴廚師我想吃什么(因為我擔心這樣一來我會吃不下去),我也不會親自到收銀臺給錢。這些服務有一個統一的獲取方式:服務員。我想吃什么和結賬,告訴服務員即可。關鍵是這一方式要統一,要足夠簡單。Spring最懶,把服務給你全部注入了,當然你也可以握住BeanFactory的纖纖細手,一個一個的get。

    3、    提供特定于我線程不安全的服務
    我點了一盤魚香肉絲,隔壁也點了一盤魚香肉絲,結果服務員讓我們吃同一盤魚香肉絲。我立刻跳起來:靠,你們的服務不是線程安全的嗎?!Hibernate的Session正是屬于這么一種情況,需要環境進行隔離,我的唯一職責就是吃飯!我的領域邏輯是如何優美的進餐!為此還要不斷重構我吃飯的姿勢哩。
    好不容易吃完飯,付完款,正準備離場。服務員風度翩翩地走到我的身旁,我以為還有打折券供應,結果是:服務員小姐輕啟朱唇:先生,麻煩您把吃剩的盤子清洗完畢。
    崩潰!
    像數據庫連接的打開,關閉、事務的打開、提交等都屬于運行期環境應該做的事情。

    4、    其他的七七八八
    雜事不少,例如統一的事件機制、權限攔截等等。

    二、    jBPM4的運行期環境
    好吧,先來看看如何建立jBPM4的運行期環境:
    EnvironmentFactory environmentFactory = new DefaultEnvironmentFactory();
     
      
     
      Environment environment 
    = environmentFactory.openEnvironment();
      
    try {
     
         everything available in 
    this block 
     
      } 
    finally {
        environment.close();
      }


    兩個關鍵的類:EnvironmentFactory和Environment。

    EnvironmentFactory是全局的,在整個應用程序中保持一個實例即可。

    Environment則是每次方法調用則要new一個。

    看看Environment的主要方法:
    public abstract Object get(String name);
    public abstract <T> T get(Class<T> type);


    是的,environment為我們的代碼提供所需要的服務類實例。

    那么,如何獲得environment?
    繼續看:
    public static Environment getCurrent();

    static,我喜歡也。方便、快捷,不管是在地上、車上還是房頂上,隨處都可調用。

    那么,為什么Environment每次調用要new呢?
    好吧,當你需要獲取數據庫Session的時候,是不是每次都要new呢。Environment提供的服務里包括了非線程安全的數據庫操作服務。

    三、    jBPM4運行期環境的實現

    1、JbpmConfiguration
    JbpmConfiguration是jBPM4里最重要的類,它是整個應用程序的入口。它實現了EnvironmentFactory接口。

          JbpmConfiguration加載jBPM總的配置文件,還是大概掃一下這個配置文件:
          <jbpm-configuration xmlns="http://jbpm.org/xsd/cfg">

      
    <process-engine-context>
     
        
    <repository-service />
        
    <repository-cache />
        
    <execution-service />
        
    <history-service />
        
    <management-service />
        
    <identity-service />
        
    <task-service />

        
    <hibernate-configuration>
          
    <cfg resource="jbpm.hibernate.cfg.xml" />    
        
    </hibernate-configuration>

        
    <hibernate-session-factory />
     
      
    </process-engine-context>

      
    <transaction-context>
        
    <repository-session />
        
    <pvm-db-session />
        
    <job-db-session />
        
    <task-db-session />
        
    <message-session />
        
    <timer-session />
        
    <history-session />
      
    </transaction-context>

    </jbpm-configuration>


    配置文件被分為了兩部分,分別是:process-engine-context和transaction-context。
    對應于兩個IOC容器(WireContext)的配置文件。

    作為EnvironmentFactory,JbpmConfiguration持有成品process-engine-context對應的IOC容器(全局的)實例,持有半成品transaction-context的WireDefinition。當調用openEnvironment方法時,JbpmConfiguration會new Environment,然后將process-engine-context IOC填充入environment,同時初始化transaction-context IOC,并將其也填充入environment。這樣通過environment就可以獲得所有所需要的服務,包括全局的和非線程安全的服務實例。也就是environment透過IOC容器提供了查找各種服務的能力。


     

    2、與線程綁定的environment
    environment初始化之后,避免參數傳遞得一塌糊涂的方式就是將environment與線程綁定。看Environment的代碼:
      static ThreadLocal<Environment> currentEnvironment = new ThreadLocal<Environment>();

      
    static ThreadLocal<Stack<Environment>> currentEnvironmentStack = new ThreadLocal<Stack<Environment>>();


    是的,在openEnvironment時,有這么一行代碼:
    Environment.pushEnvironment(environment);


    這樣environment就與線程綁定了,可以通過Environment.getCurrent()任意調用了。

    哪里有壓迫,哪里就有放抗。
    在environment.close()方法里:

    Environment.popEnvironment();


    OK,結束。




    http://www.tkk7.com/ronghao 榮浩原創,轉載請注明出處:)
    posted on 2009-06-17 18:15 ronghao 閱讀(2813) 評論(5)  編輯  收藏 所屬分類: JbpmSide

    FeedBack:
    # re: jBPM4的運行期環境
    2009-06-17 21:08 | 虎嘯龍吟
    有jbpm4這方面的例子?  回復  更多評論
      
    # re: jBPM4的運行期環境
    2009-06-18 16:44 | 魔獸世界私服
    static ThreadLocal<Stack<Environment>> currentEnvironmentStack = new ThreadLocal<Stack<Environment>>();這一行是嘛?  回復  更多評論
      
    # re: jBPM4的運行期環境
    2009-06-18 16:47 | WOW私服
    jBPM4的運行期環境還真不是一般的復雜?  回復  更多評論
      
    # re: jBPM4的運行期環境
    2009-06-22 16:40 | ronghao
    @魔獸世界私服
    實現了一個棧,可以壓入多個Environment  回復  更多評論
      
    # re: jBPM4的運行期環境
    2009-06-22 16:41 | ronghao
    @WOW私服
    很簡單的,即壓入了兩個IOC容器,并與線程綁定方便訪問。  回復  更多評論
      
    <2009年6月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    關注工作流和企業業務流程改進。現就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

    常用鏈接

    留言簿(38)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    常去的網站

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产无遮挡色视频免费视频| 亚洲V无码一区二区三区四区观看| 猫咪免费人成在线网站| 爱情岛论坛网亚洲品质自拍| 精品国产污污免费网站| 亚洲AV无码一区二区三区牛牛| 亚洲精品黄色视频在线观看免费资源 | 国产va免费精品观看精品| 国产成人久久精品亚洲小说| 亚洲av无码成人黄网站在线观看| 日韩免费精品视频| 国产精品极品美女自在线观看免费 | 亚洲AV无码乱码国产麻豆| 欧洲黑大粗无码免费| 黄视频在线观看免费| 国产精品亚洲精品观看不卡| 国产午夜亚洲精品理论片不卡| 国产精品1024永久免费视频| 亚洲精品国产日韩无码AV永久免费网| 91亚洲视频在线观看| 国产成人麻豆亚洲综合无码精品 | 亚洲A∨无码无在线观看| 国产美女无遮挡免费视频 | 暖暖日本免费在线视频| 国产婷婷成人久久Av免费高清| 亚洲s码欧洲m码吹潮| 久久狠狠高潮亚洲精品| 亚洲成AV人网址| 国产精品无码免费播放| 嫩草成人永久免费观看| 一边摸一边桶一边脱免费视频| 国产精品亚洲片在线va| 久久亚洲春色中文字幕久久久 | 亚洲激情视频图片| 亚洲AV无码一区东京热| 四虎精品亚洲一区二区三区 | 亚洲国产成人久久77| 亚洲AV无码专区国产乱码电影| 亚洲?V无码乱码国产精品| 成人免费无码大片a毛片软件| 1000部啪啪未满十八勿入免费|