欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

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

摘要

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

簡(jiǎn)介

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

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

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

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

示例應用程序

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

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

規則引擎及其工作方式

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

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

從WLI流程調用規則引擎

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

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

導入規則引擎到應用程序:

  • 在應用程序中包含規則引擎。
  • 將p13n_controls庫添加到應用程序。

處理輸入和輸出:

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

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

在應用程序中包含規則引擎

  規則引擎包含在下面的文件中:

  /weblogic81/p13n/lib/p13n_ejb.jar

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

將p13n_controls庫添加到應用程序

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

  </weblogic81/p13n/lib/p13n_controls.jar

  導航到此文件,單擊 Open 按鈕。

為輸入和結果添加變量

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

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

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

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

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

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

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

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

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

創(chuàng )建規則集

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

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

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

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

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

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

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

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

  調用與規則條件中的對象相關(guān)聯(lián)的方法很容易,如下面的示例所示,這是規則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) takesno arguments.  If it did, theywould go here<arguments>...</arguments>--></instance-method><literal:integer>5000</literal:integer></greater-than-or-equal-to></cr:conditions>

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

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

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

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

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

<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對象,獲取amount屬性并與閾值進(jìn)行比較。如果該條件滿(mǎn)足,則使用create命令向工作集中添加一個(gè)Beans.Action對象,這是通知流程執行該塊訂單的信號。

  讓我們仔細分析一下流程JPD。下面有用于調用規則引擎的Control Send節點(diǎn)的代碼。正如我們可以看到的,該節點(diǎn)使用一個(gè)Rules Executor控件來(lái)評估規則集,該控件返回一個(gè)迭代器。通過(guò)其屬性(沒(méi)有給出),控件將過(guò)濾結果,僅返回Beans.Action類(lèi)的對象。通過(guò)這些對象,代碼將提取動(dòng)作命令并執行所請求的動(dòng)作。正如前面所提到的,如果動(dòng)作是聚集該交易,則流程將使用更新后的塊作為輸入,對規則引擎開(kāi)始第二次調用。通過(guò)執行適當的動(dòng)作,對結果進(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 callthis.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 thatresults are filtered to return only items of the Beans.Action class.The command property from the Action is expected to be either thestring "create," in which case a Block trade can be executed fromthe single discrete Trade, or it is expected to be a list ofattributes describing the Block that this Trade should beincorporated into.*/while (results.hasNext()){String action =((Action)results.next()).getCommand();if (action.equals("create"))(new Block(trade)).execute();  // single-tradeelse{// Aggregate trade into an intermediate Blocktrade.aggregate(blockStorage, action);/* Call the rules engine a second time, this time usingthe resulting Block as the only input.  This is todetermine if the resulting Block now meets the criteriato execute the order. Again, results are assumed to befiltered 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)規則

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

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

  /weblogic81/p13n/lib/datasync.war

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

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

  • 按照標記將所有的交易聚集成塊。
  • 執行包含3,000或更多股的塊。

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

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

  拷貝到:

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

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

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

下載

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

結束語(yǔ)

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

參考資料

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
企業(yè)平臺中的業(yè)務(wù)規則引擎(轉載與dev2dev)
簡(jiǎn)化管理面向服務(wù)的應用程序的創(chuàng )建
一個(gè)架構藍圖,第 2 部分----構建模型的理由
工作流術(shù)語(yǔ)和定義
用 BPM、業(yè)務(wù)規則和商業(yè)智能創(chuàng )建智能的、靈活的解決方案1
《自己動(dòng)手寫(xiě)框架6》:量身定制規則引擎,適應多變業(yè)務(wù)場(chǎng)景
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久