|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
其实你不用Struts,spring这些工具,直接用jsp,servlet能够很方便地写出来,而且,可以根据个人的水平、爱好,有很多方案。而struts,spring这些工具的出来。web|静态 简介
营业使用的需求老是跟着营业情况的变更趋向而不休地改动。决议很少是刻舟求剑的,而且合作压力请求营业逻辑的计划和完成具有天真性,以疾速地顺应不休变更的需求。一般,对营业逻辑的变动必需由开辟职员来完成,然落后行屡次完全的测试,而这将是一个很耗时的历程。在使用程序的修正事情完成后,必要将其从头部署到服务器,必要留出预定的停机工夫,以防使用程序对用户不成用。
关于这个成绩,更好的办理计划是经由过程使用程序以外的一组划定规矩来完成某些营业决议。这些划定规矩并没有被编译到使用程序中,而是在运转时读取并使用。经由过程这类体例,无需变动代码大概中断正在运转的使用程序就能够改动这些划定规矩。
WebLogicPortal包含一个基础的划定规矩引擎,用于使WebLogicPlatform使用程序从划定规矩获益。只管该引擎不是功效完整的产物,但我们将展现怎样将其与WebLogicIntegrationBusinessProcesses(JPDs)一同利用来为营业逻辑供应一种天真且静态的完成机制,从而无需只为了修正划定规矩而从头部署使用程序。
起首我们来看一下将在全文中利用的示例使用程序,然后先容怎样将划定规矩引擎注进到WLI流程中以完成营业逻辑。然后,我们将更细心地研讨这些划定规矩自己和怎样为营业逻辑界说这些划定规矩,最初将形貌在运转中的体系中变动营业划定规矩所利用的机制。
示例使用程序
我们将开辟一个示例买卖使用程序作为在营业流程中利用划定规矩的例子。该买卖使用程序是一个金融买卖流程的简化版本,该流程利用挪用划定规矩引擎的JPD营业流程而构建。该示例使用程序接纳了分歧的有价证券买卖汇合,并依据一组由营业界说的划定规矩将其分构成买卖块以便实行,也许是为了削减佣金。固然,这里给出的使用程序其实不完全,但它已足以展现怎样在实际天下使用程序中利用划定规矩引擎。有完全的源代码可供下载,个中的readme文件供应了构建和运转该使用程序的申明。
在注释怎样开辟如许的使用程序之前,我们先经由过程对流派划定规矩引擎的一些特征的扼要归纳综合来懂得其事情体例。这里假定读者熟习一样平常的划定规矩手艺。
划定规矩引擎及其事情体例
申明了划定规矩引擎的基础情形。该引擎依据一组划定规矩来处置初始的现实集,而这些划定规矩由引擎从内部库中取得。初始现实用于为该引擎添补事情内存。由划定规矩来对事情内存中的现实举行评价,假如满意某条划定规矩的前提,则将实行对应的举措。一般,一个划定规矩举措将向事情内存中增加一条新的现实,偏重复该流程直到使用完一切的划定规矩。然后经由过程可选的过滤器来选择特定类的对象以前往给挪用方。能够经由过程Controls界面会见划定规矩引擎,还能够用它来设置属性(好比划定规矩集文件的地位)。
:该划定规矩引擎是一个由控件包装的EJB。贮存库中的划定规矩重复地使用于事情内存中的现实,以取得新的现实。在没法举行持续推理的情形下,对事情内存举行过滤以前往感乐趣的项目。
从WLI流程挪用划定规矩引擎
让我们从被完成为JPD的买卖营业流程入手下手,来看看怎样增加对划定规矩引擎的挪用。要在WLI流程中增加划定规矩,可使用作为WebLogicPortal的一部分而供应的RulesExecutorControl(划定规矩实行器控件)。关于本例,我们只利用该控件中所供应的办法和特征的一个子集。关于划定规矩控件的附加申明文档能够在参考材料部分找到。
此处假定开辟职员利用WebLogicWorkshop集成开辟情况来创立新的流程使用程序。然后可在该使用程序中创立一个流程项目。由于默许情形下流派控件在流程项目中不成用,以是必要将这些控件和划定规矩引擎的EJB导进到使用程序。然后,将控件输出和输入拔出到JPD中。在WLI流程中利用流派划定规矩引擎的基础步骤以下:
导进划定规矩引擎到使用程序:
- 在使用程序中包括划定规矩引擎。
- 将p13n_controls库增加到使用程序。
处置输出和输入:
- 为输出和了局增加变量。
- 创立一个RulesExecutor控件。
- 在WLI流程中增加一个ControlSendWithReturn节点。
- 为创立初始数据编写Java代码。
- 增加一个流程节点以对了局举行迭代。
- 创立划定规矩集。
前面我们将更具体地会商个中的每个步骤。
在使用程序中包括划定规矩引擎
划定规矩引擎包括鄙人面的文件中:- /weblogic81/p13n/lib/p13n_ejb.jar
复制代码 要在使用程序中包括该引擎,请右击Workshop集成开辟情况中的Modules文件夹,并选择AddModule。导航到该jar文件,并选择Open。
将p13n_controls库增加到使用程序
要使得流派划定规矩控件在使用程序中可用,请右击Workshop集成开辟情况中的Libraries文件夹,并选择AddLibrary。该控件位于:- </weblogic81/p13n/lib/p13n_controls.jar
复制代码 导航到此文件,单击Open按钮。
为输出和了局增加变量
这里利用的RulesExecutor控件办法必要一个对象数组作为输出并前往一个了局的迭代器。在Workshop集成开辟情况中为这些值创立变量,如许我们就能够鄙人一步中经由过程图形用户界面来创立控件。要完成该义务,请为DataPalette中的变量单击Add按钮,键进输出变量的称号,并键进Java范例java.lang.Object[]。利用一样的体例创立Java范例为java.util.Iterator的输入变量。
创立一个RulesExecutor控件
要创立划定规矩控件,请单击DataPalette中控件的Add按钮。从菜单当选择PortalControls->RulesExecutor。为控件键进称号,并按下Create按钮。
在WLI流程中增加一个ControlSendWithReturn节点
将方才创立的控件拖放到流程中以创立一个控件节点来实践挪用划定规矩引擎。在示例中,我们将利用控件的evaluateRuleSet()办法。从SendData面板中,选择后面为办法的输出参数而创立的输出变量。利用ReceiveData面板选择前往变量来猎取划定规矩实行的了局。在PropertyEditor窗口中为控件属性键进响应的值。
为创立初始数据编写Java代码
在创立了输出变量后,我们还没有对它赋值,以是必要编写代码来完成该义务。这个变量是一个Java对象数组,它供应了输出到划定规矩前提中的初始现实。能够创立一个新的Perform节点来初始化该数组,大概经由过程利用SourceView在ControlSend节点中增加代码来设置该变量的值。
增加一个流程节点以对了局举行迭代
RulesExecutor控件的每个盘算办法都将前往一个了局的迭代器。编写代码,利用该值完成对划定规矩实行了局的迭代。假如没有指定过滤器类,这个迭代器将前往划定规矩引擎事情内存中的一切值。个中包含原始输出和任安在实行满意前提的划定规矩的举措时增加到事情内存中的值。关于增加的对象,迭代器前往一个Result类的对象,该类的getObject()办法能够前往在划定规矩举措中所增加的实践对象。
创立划定规矩集
利用XML编纂器,在/META-INF/data目次中创立一个扩大名为.rls的文件。划定规矩一般增加到子目次rulesets中。
营业逻辑划定规矩
我们方才展现了怎样在营业流程中拔出划定规矩引擎。如今让我们来看看怎样使用该划定规矩引擎和怎样编写映照到营业划定规矩的划定规矩。
划定规矩包含两个部分:使用该划定规矩时必需为真的前提,和当前提满意时将实行的举措。因而,要在使用程序中利用划定规矩,计划职员必需起首界说哪些对象和属性在测试划定规矩前提时对划定规矩编写者是可见的。划定规矩引擎同意在一个前提中挪用恣意多个办法。这类机关体例便于界说JavaBean作为构成初始现实汇合的对象,划定规矩引擎利用这些初始现实来举行推理。可使用bean的get办法来取得前提测试的值。
划定规矩所援用的Java对象必要从创立它的WLI流程和从划定规矩引擎自己中都可见。这就制止了这些对象与流程JPD位于统一包中,更切实地说,它们应当被创立于作为统一使用程序的一部分的Java项目中。然后,这些对象能够经由过程package.class标志在划定规矩文件(.rls)和流程JPD中援用。
在我们的买卖示例中,将把分歧的买卖分组以即可以成块实行。为完成该方针,我们界说两个bean来暗示相干的对象。第一个是Tradebean,它暗示单个的买卖定单。这个bean的属性暗示买卖的份额、股分数量和所希冀的代价等。任何关于决意买卖所属的块来讲大概有效的值,都应当作为这个具有私有get办法的bean的属性,以便可以在划定规矩中利用它。第二个bean是Blockbean,经由过程它能够存储一切依据某个属性会聚合在一同的分歧买卖。这个bean的属性包含划定规矩中任何可用于判断块年夜得足以实行定单的的信息。这些属性能够是均匀代价、买卖的总美圆数或总的份额数等等。
为了在我们的使用程序中完成块功效,起首利用划定规矩来界说某项买卖是不是只必要实行其本身就充足了(也就是说,它是仅包括单个买卖的块),大概假如不是如许的话,那末应当利用甚么属性将其与其他买卖会萃以构成一个块。在一项买卖会萃到得当的块中后,就会第二次挪用划定规矩引擎来判别该块是不是完成。比方,假定我们想要失掉如许的划定规矩:
- 划定规矩1:任何5,000股及以上的单项买卖应当作为一个块并予以实行。
- 划定规矩2:由统一个投资办理者定购的具有不异标志的买卖应当会萃在一同。
- 划定规矩3:总代价凌驾,000的块应当予以实行。
挪用与划定规矩前提中的对象相干联的办法很简单,以下面的示例所示,这是划定规矩1的前提:- <cr:conditions><greater-than-or-equal-to><instance-method><variable><type-alias>Beans.Trade</type-alias></variable><name>getQuantity</name><!--getQuantity(andanyotherbeanproperty)takesnoarguments.Ifitdid,theywouldgohere<arguments>...</arguments>--></instance-method><literal:integer>5000</literal:integer></greater-than-or-equal-to></cr:conditions>
复制代码 在这个示例中,假如在我们的现实中有一个Trade对象,那末划定规矩引擎就会挪用它的getQuantity()办法而且将了局与整型5000举行对照。假如它年夜于或即是5000,则该前提为真。
划定规矩的第二部分是前提满意时实行的举措的列表。最多见的举措是:创立一个新对象,把它增加到划定规矩引擎用来评价前提的现实会合。划定规矩引擎持续对划定规矩举行迭代,直到没法处置实中得出更多的推理;向举措增加新对象会招致另外一轮的前提评价轮回。正如我们将要看到的那样,能够创立恣意范例的对象,并界说对使用程序具有特定意义的各类范例。这里的技能是,使用程序计划者能够界说一组充足丰厚的举措,以包括那些可由划定规矩编写者挪用以满意各类营业需求的义务。
在我们的买卖使用程序示例中,一切举措城市创立将增加到由划定规矩引擎利用的事情会合的新对象。有些划定规矩向该汇合中增加复杂的String对象。这些对象暗示了从原始现实中归纳出来的两头现实,它们能够在划定规矩引擎中失掉进一步的推理,但流程JPD不会以任何情势注释它们。其他的划定规矩将创立Beans.Action类的对象。这些对象包含当划定规矩前提满意时流程将实行的实践命令。流程JPD和撑持类将实行已知的举措命令来会萃买卖并实行块买卖。在这个复杂的示例中,实践上只要两个已知的命令:创立(并实行)定单、利用指定的属性会萃一项买卖。后面划定规矩2的举措是利用属性symbol和manager来举行会萃,该举措以下:- <cr:actions><new-instance><type-alias>Beans.Action</type-alias><arguments><literal:string>symbol,manager</literal:string></arguments></new-instance></cr:actions>
复制代码 呼应该举措,流程JPD及其撑持类为以后买卖查询symbol和投资manager,找出具有不异的symbol和投资manager的未实行买卖,并将这些买卖会萃到不异的块。
在完成一项买卖的会萃后,将从第二个RulesExecutor控件再次挪用划定规矩引擎,以评价划定规矩,决意是不是应当实行发生的块买卖。依据营业划定规矩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属性并与阈值举行对照。假如该前提满意,则利用create命令向事情会合增加一个Beans.Action对象,这是关照流程实行该块定单的旌旗灯号。
让我们细心剖析一下游程JPD。上面有效于挪用划定规矩引擎的ControlSend节点的代码。正如我们能够看到的,该节点利用一个RulesExecutor控件来评价划定规矩集,该控件前往一个迭代器。经由过程其属性(没有给出),控件将过滤了局,仅前往Beans.Action类的对象。经由过程这些对象,代码将提取举措命令并实行所哀求的举措。正如后面所提到的,假如举措是会萃该买卖,则流程将利用更新后的块作为输出,对划定规矩引擎入手下手第二次挪用。经由过程实行得当的举措,对了局举行第二次迭代轮回。- publicvoidrulesExecutorControlEvaluateRuleSet()throwsException{//ExecutetheRulesusingfactsastheinput//#START:CODEGENERATED-PROTECTEDSECTION-youcansafely//Addcodeabovethiscommentinthismethod.#////Inputtransform//Returnmethodcallthis.results=rulesExecutorControl.evaluateRuleSet(this.facts);//Outputtransform//Outputassignments//#END:CODEGENERATED-PROTECTEDSECTION-youcansafely//Addcodebelowthiscommentinthismethod.#///*Iterateovertheresultsofrulesexecution.ThisassumesthatresultsarefilteredtoreturnonlyitemsoftheBeans.Actionclass.ThecommandpropertyfromtheActionisexpectedtobeeitherthestring"create,"inwhichcaseaBlocktradecanbeexecutedfromthesinglediscreteTrade,oritisexpectedtobealistofattributesdescribingtheBlockthatthisTradeshouldbeincorporatedinto.*/while(results.hasNext()){Stringaction=((Action)results.next()).getCommand();if(action.equals("create"))(newBlock(trade)).execute();//single-tradeelse{//AggregatetradeintoanintermediateBlocktrade.aggregate(blockStorage,action);/*Calltherulesengineasecondtime,thistimeusingtheresultingBlockastheonlyinput.ThisistodetermineiftheresultingBlocknowmeetsthecriteriatoexecutetheorder.Again,resultsareassumedtobefilteredbythecontroltoreturnonlytheActions.*/Blockblock=trade.getBlock();ObjectblockFacts[]=newObject[1];blockFacts[0]=block;IteratorblockResults=blockRulesCntl.evaluateRuleSet(blockFacts);while(blockResults.hasNext()){action=((Action)blockResults.next()).getCommand();if(action.equals("create"))block.execute();}}}}
复制代码 静态划定规矩
WebLogicPortal的特征之一是Datasync功效,经由过程它能够将修正后的数据从头部署到集群中的流派使用程序中。由于流派划定规矩引擎从Datasync存储区中取得其划定规矩文件,以是使用程序的营业划定规矩能够在运转的体系中举行变动,而无需中断使用程序。关于Datasync和用于更新数据的DatasyncWeb使用程序的其他信息,请参阅WebLogicPortal文档。
默许情形下,DatasyncWeb使用程序将部署在惯例流派使用程序中。但是,我们的示例使用程序是一个WLI流程使用程序,因而必需在个中手动地包括Datasync。要在Workshop集成开辟情况中完成这些事情,请右击Modules文件夹,并选择AddModule。然后,选择上面的文件:
/weblogic81/p13n/lib/datasync.war
在集群中,Datasync使用程序应当仅部署到办理服务器。
为了分析怎样在运转中的使用程序中变动划定规矩,示例使用程序中包含了两个分歧的划定规矩文件,这两个文件中包含了用于将买卖会萃成块的可选划定规矩。后面已形貌了默许划定规矩(界说于traderules.rls文件中),第二个汇合(在altrules.rls中)界说以下划定规矩:
- 依照标志将一切的买卖会萃成块。
- 实行包括3,000或更多股的块。
要看到静态划定规矩的实行,起首利用所供应的测试数据运转示例使用程序。无需中断服务器大概从头部署使用程序,间接将原始划定规矩保留到一个新文件中,并将替换的划定规矩文件从:
/META-INF/data/rulesets/altrules.rls
拷贝到:
/META-INF/data/rulesets/traderules.rls
再次运转示例数据,这时候会发明发生了分歧的定单。
注重,在示例域中不必要从头运转DatasyncWeb使用程序来更新划定规矩。这是由于示例平台域以开辟形式运转。在这类形式下,Datasync主动轮询/META-INF/data目次及其子目次以搜刮变动,变动过的文件能够主动地从头部署到使用程序。在临盆域中,必要利用Web使用程序来完成数据的从头部署。保举的步骤是,起首为一切更新过的文件创立一个jar文件,jar文件的根目次应当是data。然后,利用DatasyncWeb使用程序的BootstrapData功效来从头部署包括了新划定规矩的jar文件。
下载
您能够下载本文中利用的示例程序的源代码:SampleApp.zip(2MB)
停止语
在与WLI流程使用程序一同利用时,PortalRulesEngine是完成营业逻辑的壮大工具。它很简单兼并到WLI流程中,而且可使用JavaBean来评价划定规矩前提,大概扩大作为划定规矩评价了局而实行的举措。最初,Datasync特征所供应的静态更新才能使得营业逻辑更天真,并可以在不改动Java代码的条件下顺应不休变更的需求,以是不必要从头部署使用程序。
有了这样一个呼声:让java代替C语言成为基本语言。这些足以说明java简单易学的这个优点。其次,java的功能强大,前面我也提到了,EJB3.0的推出使java成为了大型项目的首选。 |
|