Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(19)

          隨筆分類(107)

          隨筆檔案(141)

          文章分類(284)

          文章檔案(342)

          相冊

          收藏夾(58)

          家裝

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          ??????? 萬物生長靠太陽,兒童的生長離不開土壤、空氣和水,當然,也離不開綠壩娘的調教。應用程序也是如此,離不開數據庫連接、事務、日志、消息等,這些,共同構成了應用程序的運行期環境。
          ??????? 理想中的環境是什么樣子的哩。好吧,一句話,召之即來,揮之即去,當需要某個服務時,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與線程綁定??碋nvironment的代碼:
          ??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,結束。

          posted on 2009-07-14 13:13 禮物 閱讀(277) 評論(0)  編輯  收藏 所屬分類: JBPM4
          主站蜘蛛池模板: 莆田市| 博客| 华坪县| 沈阳市| 封丘县| 肃南| 冀州市| 衡阳市| 青龙| 尚义县| 平昌县| 洱源县| 香港 | 清水县| 怀柔区| 武义县| 江门市| 水城县| 罗定市| 周至县| 同德县| 会东县| 沅陵县| 宜黄县| 芷江| 西林县| 交城县| 个旧市| 尉氏县| 新兴县| 长岭县| 大竹县| 芦溪县| 古蔺县| 苍南县| 桂阳县| 阳朔县| 荔波县| 西充县| 东城区| SHOW|