乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      使用WEBLOGIC PORTAL規(guī)則引擎在WEBLOGIC INTEGRATION流程中實(shí)現(xiàn)動(dòng)態(tài)業(yè)務(wù)邏輯,第一部分

       xuyizun 2006-10-14

      摘要

        業(yè)務(wù)應(yīng)用常常需要頻繁更改邏輯以滿足企業(yè)的動(dòng)態(tài)需求。雖然這種邏輯可以使用Java來(lái)進(jìn)行編碼,但所得到的應(yīng)用程序卻不能快速適應(yīng)變化。BEA WebLogic Portal包括一個(gè)規(guī)則引擎,該引擎與WebLogic Integration業(yè)務(wù)流程一起提供了一種替代解決方案,允許業(yè)務(wù)邏輯快速變化且無(wú)需更改Java代碼。在本文中,我們將討論規(guī)則引擎的工作方式以及將其合并到WebLogic Integration (WLI)流程中所需的步驟。我們還將介紹如何在規(guī)則引擎中使用JavaBean為要實(shí)施的規(guī)則描述對(duì)象的隨機(jī)集合并為后端處理提供動(dòng)作。最后,我們將描述如何通過(guò)WebLogic Portal的Datasync機(jī)制在運(yùn)行中的系統(tǒng)中更新一組規(guī)則而無(wú)需重新部署應(yīng)用程序。

      簡(jiǎn)介

        業(yè)務(wù)應(yīng)用的需求總是隨著業(yè)務(wù)環(huán)境的變化趨勢(shì)而不斷地改變。決策很少是一成不變的,并且競(jìng)爭(zhēng)壓力要求業(yè)務(wù)邏輯的設(shè)計(jì)和實(shí)現(xiàn)具有靈活性,以快速地適應(yīng)不斷變化的需求。通常,對(duì)業(yè)務(wù)邏輯的更改必須由開(kāi)發(fā)人員來(lái)完成,然后進(jìn)行多次徹底的測(cè)試,而這將是一個(gè)很耗時(shí)的過(guò)程。在應(yīng)用程序的修改工作完成后,需要將其重新部署到服務(wù)器,需要留出預(yù)定的停機(jī)時(shí)間,以防應(yīng)用程序?qū)τ脩舨豢捎谩?/p>

        對(duì)于這個(gè)問(wèn)題,更好的解決方案是通過(guò)應(yīng)用程序之外的一組規(guī)則來(lái)實(shí)現(xiàn)某些業(yè)務(wù)決策。這些規(guī)則并沒(méi)有被編譯到應(yīng)用程序中,而是在運(yùn)行時(shí)讀取并應(yīng)用。通過(guò)這種方式,無(wú)需更改代碼或者停止正在運(yùn)行的應(yīng)用程序就可以改變這些規(guī)則。

        WebLogic Portal包括一個(gè)基本的規(guī)則引擎,用于使WebLogic Platform應(yīng)用程序從規(guī)則獲益。盡管該引擎不是功能完備的產(chǎn)品,但我們將展示如何將其與WebLogic Integration Business Processes (JPDs)一起使用來(lái)為業(yè)務(wù)邏輯提供一種靈活且動(dòng)態(tài)的實(shí)現(xiàn)機(jī)制,從而無(wú)需只為了修改規(guī)則而重新部署應(yīng)用程序。

        首先我們來(lái)看一下將在全文中使用的示例應(yīng)用程序,然后介紹如何將規(guī)則引擎注入到WLI流程中以實(shí)現(xiàn)業(yè)務(wù)邏輯。然后,我們將更仔細(xì)地研究這些規(guī)則本身以及如何為業(yè)務(wù)邏輯定義這些規(guī)則,最后將描述在運(yùn)行中的系統(tǒng)中更改業(yè)務(wù)規(guī)則所使用的機(jī)制。

      示例應(yīng)用程序

        我們將開(kāi)發(fā)一個(gè)示例交易應(yīng)用程序作為在業(yè)務(wù)流程中使用規(guī)則的例子。該交易應(yīng)用程序是一個(gè)金融交易流程的簡(jiǎn)化版本,該流程使用調(diào)用規(guī)則引擎的JPD業(yè)務(wù)流程而構(gòu)建。該示例應(yīng)用程序采用了不同的有價(jià)證券交易集合,并根據(jù)一組由業(yè)務(wù)定義的規(guī)則將其分組成交易塊以便執(zhí)行,或許是為了減少傭金。當(dāng)然,這里給出的應(yīng)用程序并不完整,但它已經(jīng)足以展示如何在現(xiàn)實(shí)世界應(yīng)用程序中使用規(guī)則引擎。有完整的源代碼可供下載,其中的readme文件提供了構(gòu)建和運(yùn)行該應(yīng)用程序的說(shuō)明。

        在解釋如何開(kāi)發(fā)這樣的應(yīng)用程序之前,我們先通過(guò)對(duì)門(mén)戶規(guī)則引擎的一些特性的簡(jiǎn)要概括來(lái)了解其工作方式。這里假定讀者熟悉一般的規(guī)則技術(shù)。

      規(guī)則引擎及其工作方式

        圖1說(shuō)明了規(guī)則引擎的基本情況。該引擎根據(jù)一組規(guī)則來(lái)處理初始的事實(shí)集,而這些規(guī)則由引擎從外部庫(kù)中獲得。初始事實(shí)用于為該引擎填充工作內(nèi)存。由規(guī)則來(lái)對(duì)工作內(nèi)存中的事實(shí)進(jìn)行評(píng)估,如果滿足某條規(guī)則的條件,則將執(zhí)行對(duì)應(yīng)的動(dòng)作。通常,一個(gè)規(guī)則動(dòng)作將向工作內(nèi)存中添加一條新的事實(shí),并重復(fù)該流程直到應(yīng)用完所有的規(guī)則。然后通過(guò)可選的過(guò)濾器來(lái)選擇特定類的對(duì)象以返回給調(diào)用方??梢酝ㄟ^(guò)Controls界面訪問(wèn)規(guī)則引擎,還可以用它來(lái)設(shè)置屬性(比如規(guī)則集文件的位置)。

      圖1:該規(guī)則引擎是一個(gè)由控件包裝的EJB

        圖1:該規(guī)則引擎是一個(gè)由控件包裝的EJB。儲(chǔ)存庫(kù)中的規(guī)則反復(fù)地應(yīng)用于工作內(nèi)存中的事實(shí),以獲得新的事實(shí)。在無(wú)法進(jìn)行繼續(xù)推理的情況下,對(duì)工作內(nèi)存進(jìn)行過(guò)濾以返回感興趣的項(xiàng)目。

      從WLI流程調(diào)用規(guī)則引擎

        讓我們從被實(shí)現(xiàn)為JPD的交易業(yè)務(wù)流程開(kāi)始,來(lái)看看如何添加對(duì)規(guī)則引擎的調(diào)用。要在WLI流程中添加規(guī)則,可以使用作為WebLogic Portal的一部分而提供的Rules Executor Control(規(guī)則執(zhí)行器控件)。對(duì)于本例,我們只使用該控件中所提供的方法和特性的一個(gè)子集。關(guān)于規(guī)則控件的附加說(shuō)明文檔可以在參考資料部分找到。

        此處假定開(kāi)發(fā)人員使用WebLogic Workshop集成開(kāi)發(fā)環(huán)境來(lái)創(chuàng)建新的流程應(yīng)用程序。然后可在該應(yīng)用程序中創(chuàng)建一個(gè)流程項(xiàng)目。因?yàn)槟J(rèn)情況下門(mén)戶控件在流程項(xiàng)目中不可用,所以需要將這些控件和規(guī)則引擎的EJB導(dǎo)入到應(yīng)用程序。然后,將控件輸入和輸出插入到JPD中。在WLI流程中使用門(mén)戶規(guī)則引擎的基本步驟如下:

      導(dǎo)入規(guī)則引擎到應(yīng)用程序:

      • 在應(yīng)用程序中包含規(guī)則引擎。
      • 將p13n_controls庫(kù)添加到應(yīng)用程序。

      處理輸入和輸出:

      • 為輸入和結(jié)果添加變量。
      • 創(chuàng)建一個(gè)Rules Executor控件。
      • 在WLI流程中添加一個(gè)Control Send With Return節(jié)點(diǎn)。
      • 為創(chuàng)建初始數(shù)據(jù)編寫(xiě)Java代碼。
      • 添加一個(gè)流程節(jié)點(diǎn)以對(duì)結(jié)果進(jìn)行迭代。
      • 創(chuàng)建規(guī)則集。

        后面我們將更詳細(xì)地討論其中的每一個(gè)步驟。

      在應(yīng)用程序中包含規(guī)則引擎

        規(guī)則引擎包含在下面的文件中:

        /weblogic81/p13n/lib/p13n_ejb.jar

        要在應(yīng)用程序中包含該引擎,請(qǐng)右擊Workshop集成開(kāi)發(fā)環(huán)境中的Modules文件夾,并選擇Add Module。導(dǎo)航到該jar文件,并選擇Open。

      將p13n_controls庫(kù)添加到應(yīng)用程序

        要使得門(mén)戶規(guī)則控件在應(yīng)用程序中可用,請(qǐng)右擊Workshop集成開(kāi)發(fā)環(huán)境中的Libraries文件夾,并選擇Add Library。該控件位于:

        </weblogic81/p13n/lib/p13n_controls.jar

        導(dǎo)航到此文件,單擊 Open 按鈕。

      為輸入和結(jié)果添加變量

        這里使用的Rules Executor控件方法需要一個(gè)對(duì)象數(shù)組作為輸入并返回一個(gè)結(jié)果的迭代器。在Workshop集成開(kāi)發(fā)環(huán)境中為這些值創(chuàng)建變量,這樣我們就可以在下一步中通過(guò)圖形用戶界面來(lái)創(chuàng)建控件。要完成該任務(wù),請(qǐng)為Data Palette中的變量單擊Add按鈕,鍵入輸入變量的名稱,并鍵入Java類型java.lang.Object[]。使用同樣的方式創(chuàng)建Java類型為java.util.Iterator的輸出變量。

      創(chuàng)建一個(gè)Rules Executor控件

        要?jiǎng)?chuàng)建規(guī)則控件,請(qǐng)單擊Data Palette中控件的Add按鈕。從菜單中選擇Portal Controls -> Rules Executor。為控件鍵入名稱,并按下Create按鈕。

      在WLI流程中添加一個(gè)Control Send With Return節(jié)點(diǎn)

        將剛剛創(chuàng)建的控件拖放到流程中以創(chuàng)建一個(gè)控件節(jié)點(diǎn)來(lái)實(shí)際調(diào)用規(guī)則引擎。在示例中,我們將使用控件的evaluateRuleSet()方法。從Send Data面板中,選擇前面為方法的輸入?yún)?shù)而創(chuàng)建的輸入變量。使用Receive Data面板選擇返回變量來(lái)獲取規(guī)則執(zhí)行的結(jié)果。在Property Editor窗口中為控件屬性鍵入相應(yīng)的值。

      為創(chuàng)建初始數(shù)據(jù)編寫(xiě)Java代碼

        在創(chuàng)建了輸入變量后,我們還沒(méi)有對(duì)它賦值,所以需要編寫(xiě)代碼來(lái)完成該任務(wù)。這個(gè)變量是一個(gè)Java對(duì)象數(shù)組,它提供了輸入到規(guī)則條件中的初始事實(shí)。可以創(chuàng)建一個(gè)新的Perform節(jié)點(diǎn)來(lái)初始化該數(shù)組,或者通過(guò)使用Source View在Control Send節(jié)點(diǎn)中添加代碼來(lái)設(shè)置該變量的值。

      添加一個(gè)流程節(jié)點(diǎn)以對(duì)結(jié)果進(jìn)行迭代

        Rules Executor控件的每一個(gè)計(jì)算方法都將返回一個(gè)結(jié)果的迭代器。編寫(xiě)代碼,使用該值實(shí)現(xiàn)對(duì)規(guī)則執(zhí)行結(jié)果的迭代。如果沒(méi)有指定過(guò)濾器類,這個(gè)迭代器將返回規(guī)則引擎工作內(nèi)存中的所有值。其中包括原始輸入以及任何在執(zhí)行滿足條件的規(guī)則的動(dòng)作時(shí)添加到工作內(nèi)存中的值。對(duì)于添加的對(duì)象,迭代器返回一個(gè)Result類的對(duì)象,該類的getObject()方法可以返回在規(guī)則動(dòng)作中所添加的實(shí)際對(duì)象。

      創(chuàng)建規(guī)則集

        使用XML編輯器,在/META-INF/data目錄中創(chuàng)建一個(gè)擴(kuò)展名為.rls的文件。規(guī)則通常添加到子目錄rulesets中。

      業(yè)務(wù)邏輯規(guī)則

        我們剛剛展示了如何在業(yè)務(wù)流程中插入規(guī)則引擎?,F(xiàn)在讓我們來(lái)看看如何利用該規(guī)則引擎以及如何編寫(xiě)映射到業(yè)務(wù)規(guī)則的規(guī)則。

        規(guī)則包括兩個(gè)部分:應(yīng)用該規(guī)則時(shí)必須為真的條件,以及當(dāng)條件滿足時(shí)將執(zhí)行的動(dòng)作。因此,要在應(yīng)用程序中使用規(guī)則,設(shè)計(jì)人員必須首先定義哪些對(duì)象和屬性在測(cè)試規(guī)則條件時(shí)對(duì)規(guī)則編寫(xiě)者是可見(jiàn)的。規(guī)則引擎允許在一個(gè)條件中調(diào)用任意多個(gè)方法。這種構(gòu)造方式便于定義JavaBean作為組成初始事實(shí)集合的對(duì)象,規(guī)則引擎使用這些初始事實(shí)來(lái)進(jìn)行推理??梢允褂胋ean的 get方法來(lái)獲得條件測(cè)試的值。

        規(guī)則所引用的Java對(duì)象需要從創(chuàng)建它的WLI流程以及從規(guī)則引擎本身中都可見(jiàn)。這就避免了這些對(duì)象與流程JPD位于同一包中,更確切地說(shuō),它們應(yīng)該被創(chuàng)建于作為同一應(yīng)用程序的一部分的Java項(xiàng)目中。然后,這些對(duì)象可以通過(guò)package.class標(biāo)記在規(guī)則文件(.rls)和流程JPD中引用。

        在我們的交易示例中,將把不同的交易分組以便可以成塊執(zhí)行。為實(shí)現(xiàn)該目標(biāo),我們定義兩個(gè)bean來(lái)表示相關(guān)的對(duì)象。第一個(gè)是Trade bean,它表示單個(gè)的交易訂單。這個(gè)bean的屬性表示交易的份額、股份數(shù)目以及所期望的價(jià)格等。任何對(duì)于決定交易所屬的塊來(lái)說(shuō)可能有用的值,都應(yīng)該作為這個(gè)具有公有g(shù)et方法的bean的屬性,以便能夠在規(guī)則中使用它。第二個(gè)bean是Block bean,通過(guò)它可以存儲(chǔ)所有根據(jù)某個(gè)屬性集聚合在一起的不同交易。這個(gè)bean的屬性包括規(guī)則中任何可用于判定塊大得足以執(zhí)行訂單的的信息。這些屬性可以是平均價(jià)格、交易的總美元數(shù)或總的份額數(shù)等等。

        為了在我們的應(yīng)用程序中實(shí)現(xiàn)塊功能,首先使用規(guī)則來(lái)定義某項(xiàng)交易是否只需要執(zhí)行其自身就足夠了(也就是說(shuō),它是僅包含單個(gè)交易的塊),或者如果不是這樣的話,那么應(yīng)該使用什么屬性將其與其他交易聚集以形成一個(gè)塊。在一項(xiàng)交易聚集到適當(dāng)?shù)膲K中后,就會(huì)第二次調(diào)用規(guī)則引擎來(lái)判斷該塊是否完成。例如,假設(shè)我們想要得到這樣的規(guī)則:

      • 規(guī)則1:任何5,000股及以上的單項(xiàng)交易應(yīng)該作為一個(gè)塊并予以執(zhí)行。
      • 規(guī)則2:由同一個(gè)投資管理者定購(gòu)的具有相同標(biāo)記的交易應(yīng)該聚集在一起。
      • 規(guī)則3:總價(jià)值超過(guò),000的塊應(yīng)該予以執(zhí)行。

        調(diào)用與規(guī)則條件中的對(duì)象相關(guān)聯(lián)的方法很容易,如下面的示例所示,這是規(guī)則1的條件:

      <cr:conditions>
      <greater-than-or-equal-to>
      <instance-method>
      <variable>
      <type-alias>Beans.Trade</type-alias>
      </variable>
      <name>getQuantity</name>
      <!-- getQuantity (and any other bean property) takes
      no arguments.  If it did, they
      would go here
      <arguments>...</arguments>
      -->
      </instance-method>
      <literal:integer>
      5000
      </literal:integer>
      </greater-than-or-equal-to>
      </cr:conditions>
      

        在這個(gè)示例中,如果在我們的事實(shí)中有一個(gè)Trade對(duì)象,那么規(guī)則引擎就會(huì)調(diào)用它的getQuantity()方法并且將結(jié)果與整型5000進(jìn)行比較。如果它大于或等于5000,則該條件為真。

        規(guī)則的第二部分是條件滿足時(shí)執(zhí)行的動(dòng)作的列表。最常見(jiàn)的動(dòng)作是:創(chuàng)建一個(gè)新對(duì)象,把它添加到規(guī)則引擎用來(lái)評(píng)估條件的事實(shí)集中。規(guī)則引擎繼續(xù)對(duì)規(guī)則進(jìn)行迭代,直到無(wú)法從事實(shí)中得出更多的推理;向動(dòng)作添加新對(duì)象會(huì)導(dǎo)致另一輪的條件評(píng)估循環(huán)。正如我們將要看到的那樣,可以創(chuàng)建任意類型的對(duì)象,并定義對(duì)應(yīng)用程序具有特定意義的各種類型。這里的技巧是,應(yīng)用程序設(shè)計(jì)者可以定義一組足夠豐富的動(dòng)作,以包含那些可由規(guī)則編寫(xiě)者調(diào)用以滿足各種業(yè)務(wù)需求的任務(wù)。

        在我們的交易應(yīng)用程序示例中,所有動(dòng)作都會(huì)創(chuàng)建將添加到由規(guī)則引擎使用的工作集中的新對(duì)象。有些規(guī)則向該集合中添加簡(jiǎn)單的String對(duì)象。這些對(duì)象表示了從原始事實(shí)中演繹出來(lái)的中間事實(shí),它們可以在規(guī)則引擎中得到進(jìn)一步的推理,但流程JPD不會(huì)以任何形式解釋它們。其他的規(guī)則將創(chuàng)建Beans.Action類的對(duì)象。這些對(duì)象包括當(dāng)規(guī)則條件滿足時(shí)流程將執(zhí)行的實(shí)際命令。流程JPD和支持類將實(shí)施已知的動(dòng)作命令來(lái)聚集交易并執(zhí)行塊交易。在這個(gè)簡(jiǎn)單的示例中,實(shí)際上只有兩個(gè)已知的命令:創(chuàng)建(并執(zhí)行)訂單、使用指定的屬性聚集一項(xiàng)交易。前面規(guī)則2的動(dòng)作是使用屬性symbol和manager來(lái)進(jìn)行聚集,該動(dòng)作如下:

      <cr:actions>
      <new-instance>
      <type-alias>Beans.Action</type-alias>
      <arguments>
      <literal:string>symbol, manager</literal:string>
      </arguments>
      </new-instance>
      </cr:actions>
      

        響應(yīng)該動(dòng)作,流程JPD及其支持類為當(dāng)前交易查詢symbol和投資manager,找出具有相同的symbol和投資manager的未執(zhí)行交易,并將這些交易聚集到相同的塊。

        在完成一項(xiàng)交易的聚集后,將從第二個(gè)Rules Executor控件再次調(diào)用規(guī)則引擎,以評(píng)估規(guī)則,決定是否應(yīng)該執(zhí)行產(chǎn)生的塊交易。根據(jù)業(yè)務(wù)規(guī)則3,該規(guī)則如下:

      <cr:conditions>
      <greater-than >
      <instance-method>
      <variable>
      <type-alias>Beans.Block</type-alias>
      </variable>
      <name>getAmount</name>
      </instance-method>
      <literal:float>
      50000.00
      </literal:float>
      </greater-than >
      </cr:conditions>
      <cr:actions>
      <new-instance>
      <type-alias>Beans.Action</type-alias>
      <arguments>
      <literal:string>create</literal:string>
      </arguments>
      </new-instance>
      </cr:actions>
      

        這一次,我們分析Beans.Block對(duì)象,獲取amount屬性并與閾值進(jìn)行比較。如果該條件滿足,則使用create命令向工作集中添加一個(gè)Beans.Action對(duì)象,這是通知流程執(zhí)行該塊訂單的信號(hào)。

        讓我們仔細(xì)分析一下流程JPD。下面有用于調(diào)用規(guī)則引擎的Control Send節(jié)點(diǎn)的代碼。正如我們可以看到的,該節(jié)點(diǎn)使用一個(gè)Rules Executor控件來(lái)評(píng)估規(guī)則集,該控件返回一個(gè)迭代器。通過(guò)其屬性(沒(méi)有給出),控件將過(guò)濾結(jié)果,僅返回Beans.Action類的對(duì)象。通過(guò)這些對(duì)象,代碼將提取動(dòng)作命令并執(zhí)行所請(qǐng)求的動(dòng)作。正如前面所提到的,如果動(dòng)作是聚集該交易,則流程將使用更新后的塊作為輸入,對(duì)規(guī)則引擎開(kāi)始第二次調(diào)用。通過(guò)執(zhí)行適當(dāng)?shù)膭?dòng)作,對(duì)結(jié)果進(jìn)行第二次迭代循環(huán)。

      public void rulesExecutorControlEvaluateRuleSet()
      throws Exception
      {
      // Execute the Rules using facts as the input
      //#START: CODE GENERATED - PROTECTED SECTION - you can safely
      // Add code above this comment in this method. #//
      // Input transform
      // Return method call
      this.results =
      rulesExecutorControl.evaluateRuleSet(this.facts);
      // Output transform
      // Output assignments
      //#END  : CODE GENERATED - PROTECTED SECTION - you can safely
      // Add code below this comment in this method. #//
      /* Iterate over the results of rules execution. This assumes that
      results are filtered to return only items of the Beans.Action class.
      The command property from the Action is expected to be either the
      string "create," in which case a Block trade can be executed from
      the single discrete Trade, or it is expected to be a list of
      attributes describing the Block that this Trade should be
      incorporated into.
      */
      while (results.hasNext())
      {
      String action =
      ((Action)results.next()).getCommand();
      if (action.equals("create"))
      (new Block(trade)).execute();  // single-trade
      else
      {
      // Aggregate trade into an intermediate Block
      trade.aggregate(blockStorage, action);
      /* Call the rules engine a second time, this time using
      the resulting Block as the only input.  This is to
      determine if the resulting Block now meets the criteria
      to execute the order. Again, results are assumed to be
      filtered by the control to return only the Actions.
      */
      Block block = trade.getBlock();
      Object blockFacts[] = new Object[1];
      blockFacts[0] = block;
      Iterator blockResults =
      blockRulesCntl.evaluateRuleSet(blockFacts);
      while (blockResults.hasNext())
      {
      action =
      ((Action)blockResults.next()).getCommand();
      if (action.equals("create"))
      block.execute();
      }
      }
      }
      }
      

      動(dòng)態(tài)規(guī)則

        WebLogic Portal的特性之一是Datasync功能,通過(guò)它可以將修改后的數(shù)據(jù)重新部署到集群中的門(mén)戶應(yīng)用程序中。因?yàn)殚T(mén)戶規(guī)則引擎從Datasync存儲(chǔ)區(qū)中獲得其規(guī)則文件,所以應(yīng)用程序的業(yè)務(wù)規(guī)則可以在運(yùn)行的系統(tǒng)中進(jìn)行更改,而無(wú)需停止應(yīng)用程序。關(guān)于Datasync以及用于更新數(shù)據(jù)的Datasync Web應(yīng)用程序的其他信息,請(qǐng)參閱WebLogic Portal文檔。

        默認(rèn)情況下,Datasync Web應(yīng)用程序?qū)⒉渴鹪诔R?guī)門(mén)戶應(yīng)用程序中。然而,我們的示例應(yīng)用程序是一個(gè)WLI流程應(yīng)用程序,因此必須在其中手動(dòng)地包含Datasync。要在Workshop集成開(kāi)發(fā)環(huán)境中完成這些工作,請(qǐng)右擊Modules文件夾,并選擇Add Module。然后,選擇下面的文件:

        /weblogic81/p13n/lib/datasync.war

        在集群中,Datasync應(yīng)用程序應(yīng)該僅部署到管理服務(wù)器。

        為了闡明如何在運(yùn)行中的應(yīng)用程序中更改規(guī)則,示例應(yīng)用程序中包括了兩個(gè)不同的規(guī)則文件,這兩個(gè)文件中包括了用于將交易聚集成塊的可選規(guī)則。前面已經(jīng)描述了默認(rèn)規(guī)則(定義于traderules.rls文件中),第二個(gè)集合(在altrules.rls中)定義如下規(guī)則:

      • 按照標(biāo)記將所有的交易聚集成塊。
      • 執(zhí)行包含3,000或更多股的塊。

        要看到動(dòng)態(tài)規(guī)則的執(zhí)行,首先使用所提供的測(cè)試數(shù)據(jù)運(yùn)行示例應(yīng)用程序。無(wú)需停止服務(wù)器或者重新部署應(yīng)用程序,直接將原始規(guī)則保存到一個(gè)新文件中,并將替代的規(guī)則文件從:

        /META-INF/data/rulesets/altrules.rls

        拷貝到:

        /META-INF/data/rulesets/traderules.rls

        再次運(yùn)行示例數(shù)據(jù),這時(shí)會(huì)發(fā)現(xiàn)產(chǎn)生了不同的訂單。

        注意,在示例域中不需要重新運(yùn)行Datasync Web應(yīng)用程序來(lái)更新規(guī)則。這是因?yàn)槭纠脚_(tái)域以開(kāi)發(fā)模式運(yùn)行。在這種模式下,Datasync自動(dòng)輪詢 /META-INF/data目錄及其子目錄以搜索更改,更改過(guò)的文件可以自動(dòng)地重新部署到應(yīng)用程序。在生產(chǎn)域中,需要使用Web應(yīng)用程序來(lái)實(shí)現(xiàn)數(shù)據(jù)的重新部署。推薦的步驟是,首先為所有更新過(guò)的文件創(chuàng)建一個(gè)jar文件,jar文件的根目錄應(yīng)該是data。然后,使用Datasync Web應(yīng)用程序的Bootstrap Data功能來(lái)重新部署包含了新規(guī)則的jar文件。

      下載

        您可以下載本文中使用的示例程序的源代碼:SampleApp.zip (2MB)

      結(jié)束語(yǔ)

        在與WLI流程應(yīng)用程序一起使用時(shí),Portal Rules Engine是實(shí)現(xiàn)業(yè)務(wù)邏輯的強(qiáng)大工具。它很容易合并到WLI流程中,并且可以使用JavaBean來(lái)評(píng)估規(guī)則條件,或者擴(kuò)展作為規(guī)則評(píng)估結(jié)果而執(zhí)行的動(dòng)作。最后,Datasync特性所提供的動(dòng)態(tài)更新能力使得業(yè)務(wù)邏輯更靈活,并能夠在不改變Java代碼的前提下適應(yīng)不斷變化的需求,所以不需要重新部署應(yīng)用程序。

      參考資料

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多