kapok

垃圾桶,嘿嘿,我藏的这么深你们还能找到啊,真牛!

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  455 随笔 :: 0 文章 :: 76 评论 :: 0 Trackbacks

http://dev2dev.bea.com.cn/techdoc/wlportal/200404173.html

WebLogic Portal
通过一套组件提供了一种健壮的个性化解决方案,这些组件提供了运行时服务,用于向浏览Web站点的最终用户交付个性化的内容。这些个性化组件利用业务规则来匹配具有合适内容的用户和用户组。围绕业务规则的逻辑是个性化处理过程的关键部分。

1.           Weblogic Portal Rules Management Framework提供了运行时功能,用于提供基于具体规则的个性化内容。

2.           Rules Manager EJB 是用于访问底层 BEA Rules Engine的一个可伸缩的、无状态的 J2EE 入口点。它提供了执行用户定义的业务规则所必需的运行时服务。

3.           两个Portal控件:RulesManagerControlRulesExecutorControl,提供了访问Rules Manager EJB的方便手段。


Portal
自带了一些规则,例如内容选择器和活动(campaigns)。用户可以手工建立自定义规则。在把规则部署到Portal之前,可以使用 PortalExpression包,或者Xml Spy 来验证这些规则的有效性。

业务规则可以动态地加载和修改,这样,通过Workshop IDE,提供了一种测试已部署应用程序中规则的有效方式。

规则引擎的工作原理


规则引擎(Rules Engine)的运作机制是在内存中向对象应用一套规则。首先内存使用来自调用对象的输入,例如用户档案请求会话。这样,在任何规则实际激活之前,在内存中就已经有了一份用户档案的内容。

规则只能在一个上下文环境中执行,上下文环境把规则集和内存关联起来。该环境提供了到Rules Engine的接口,Rules Engine控制着应用程序的规则部分与内存之间的关系。

内存由生产规则(production rules)负责操作,生产规则包含在规则集里。,依照规则的左半边(left-hand sidesLHS)针对内存中的对象进行计算。如果内存中的对象与LHS中描述的模式匹配,就会触发规则的右半边(right-hand sideRHS)指定的操作。 此外某些操作可能会在内存中加入新的对象。例如,规则 Classifier 对用户年龄进行测试,如果 USER.age > 45,就在内存中加入一个新的Classification 对象。

生产系统的运行,要执行以下操作:

1.           匹配: 估计规则的LHS,判断哪个规则与当前内存中的内容匹配。

2.           冲突解决:选择一个LHS匹配的规则。如果没有规则匹配,就停止解释。

3.           操作: 执行选中规则RHS中指定的动作。

4.           返回第1步。


规则会一直在内存中执行,直到冲突解决集变为0时才停止(也就是没有规则能激活了)。

Rules Engine停止之后,规则管理器组件会返回一个对象列表,列表中包含内存中仍然存在的对象。一个可能的场景就是,还剩下一个类型为“Classification”或“ContentQuery”的对象。

Rules Manager
接着对剩下的对象进行迭代,用可选的对象过滤器过滤它们。过滤器可以有选择地忽略某些对象或者对某些对象进行变换。

使用门户规则服务


要使用门户规则服务(Portal Rules Service),有几个步骤。首先,必须预先建立规则,然后把规则部署到一个正在运行的Weblogic服务器实例中。接着,规则被计算,而计算结果在返回用户之前,有可能先被过滤。最后,用户在应用程序代码里利用经过规则处理的结果。

建立规则集


规则集是符合特定模式的XML文件(详见XmlSpy的链接)。规则“语言”实际就是Portal表达软件包的使用,可以扩充以满足规则引擎的额外要求。

<cr:rule-set is-complete="true" xmlns="http://www.bea.com/servers/p13n/xsd/expression/expressions/2.1.1"

    xmlns:cr="http://www.bea.com/servers/p13n/xsd/rules/core/2.1.1"

    xmlns:literal="http://www.bea.com/servers/p13n/xsd/expression/literal/1.0.1"

    xmlns:string="http://www.bea.com/servers/p13n/xsd/expression/string/1.0.1"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.bea.com/servers/p13n/xsd/rules/core/2.1.1 rules-core-2_1_1.xsd">

        <cr:rule is-complete="true">

           <cr:name>AddInteger</cr:name>

           <cr:description>Simple value test </cr:description>

           <cr:conditions>

                 <equal-to>

               <variable>

                     <type-alias>java.lang.String</type-alias>

               </variable>

                     <literal:string>Nederland</literal:string>

                   </equal-to>

             </cr:conditions>

             <cr:actions>

<cr:add-object>

                  <type-alias>java.lang.Integer</type-alias>

                      <arguments>

                       <literal:string>10</literal:string>

                     </arguments>

                </cr:add-object>

             </cr:actions>

        </cr:rule>

</cr:rule-set>


规则集的扩展名为.rls,由以下几部分构成:

·             标签 <cr:rule-set> 包含了对文档(规则集)中所使用的模式的所有引用

·             一个或多个规则,由标签 <cr:rule> 定义

·             在每个规则里,用标签 <cr:condition>定义一个或多个测试条件,用标签 <cr:actions>定义一个或多个动作


测试条件是输入对象可以满足的测试;操作(action)一般是当规则条件被满足,规则被触发时,被实例化进内存中的对象。

实际上,建立规则集的最简单方法就是从一个现有的规则集开始,并修改现有的规则集。本文的例子里有几个规则集。可以使用XML Spy这样的工具手动建立规则集。规则和表达模式在p13n_ejb.jar文件里可以找到,位置是在 lib/schema目录下。

部署规则集


每个应用程序都与自己的数据实例相关联,这些数据的存储于应用程序的 META-INF/data 文件夹中。这个文件夹下面以及该文夹件的子文件夹里的任何数据,都能通过数据同步机制进行部署。作为最佳实践,我喜欢在保存规则集的文件夹下面建立一个子文件夹“rulesets”。

规则服务使用门户数据同步机制(Portal Data Sync)来把规则集部署到运行服务器。也就是说,用户只需把规则集保存在数据同步文件夹里,规则集就会自动被部署。如果文件夹里已经存在相同的规则集,那么数据同步机制会自动检查规则集的变化,规则服务数据库会自动刷新规则集的实例。规则集文件必须以.rls为扩展名,这样规则管理器才会认识它。

例如,如果我的应用程序是 drtApp,我把我的规则集放在drtApp/META-INF/data/rulesets文件夹里。现在,当服务器首次启动,规则服务第一次调用时,这个文件夹里的所有规则集都会被数据同步机制加载,供规则引擎使用。

那么,如果想在规则控件或EJB API里调用规则集的URI,那么所使用的文件名应当相对于 META-INF/data文件夹。例如,如果我把规则集 simple.rls 放在 drtApp/META-INF/data/rulesets文件夹里,就应当用 /rulesets/simple.rls”这样的URI来引用它。

只要修改数据同步规则集文件夹的内容,数据同步机制就会重新载入规则集(规则集发生修改)或者从规则服务器删除规则集(规则集被删除)。

这意味着我们可以在服务器运行的时候调整规则,或者对解析错误进行调试。修改规则集之后,无需重新启动服务器。

规则服务组件


Portal
控件是易于使用的用于表示和执行业务逻辑的组件。这些组件都是图形控件,可以在WebLogic Workshop里使用。RulesExecutorControl就是这样一个控件,它可以执行已经命名的规则和规则集,在规则集计算之后还可以对计算结果进行过滤。

在使用这个控件之前,需要配置控件的几个属性:

·             包含规则的规则集的 URI。如前所述,URI要相对于应用程序的META-INF/data 文件夹。

·             用于计算的规则的名称。如果没有指定规则,那么规则集中的全部规则都会被计算。

·             可选的过滤器参数,详见下文。


dev2dev上还有另一篇有关规则的文章,说明了如何使用这个控件动态引导页面流 这个RulesExecutorControl控件实际上封装了RulesManager EJBp13n_ejb.jar 文件中的任何Portal应用程序都可以使用这个EJB,并可用于直接调用规则服务(不过,最好是用控件进行调用)。有关RulesManager EJB API的调用说明,详见Portal的在线文档javadocs

对规则进行计算


对规则集进行计算,可以考虑通过以下步骤:

·             Portal的规则引擎初始化,建立“内存”。

·             规则控件指明要使用哪个规则集,并且还可以进一步指定要对哪个规则进行计算 (默认是全部规则都计算),以及是否过滤计算结果。所有这些参数都可以通过Rules控件进行配置,并传递给规则引擎,用于对规则进行计算。

·             开发人员建立对象,并把对象加入“内存”。示例对象可能是用户的档案、Request对象等。 这些参数会作为变量传递给规则控件的evaluate() 方法

·             通过RulesExecutorControl调用规则引擎。

·             规则引擎根据输入的规则集和输入的对象创建Rete Network

·             规则引擎反复触发,根据输入对象的状态和规则条件执行规则。

·             当规则引擎遇到没有规则可以触发的时候,计算结果和所有的原始输入对象一起存在于内存里。

·             由于输入对象也是结果的一部分,因此可以根据一个类对结果进行过滤。例如,可以指定只返回类 com.bea.p13n.usermgmt.profile.ProfileWrapper的结果。下面一节的例子显示了如何建立和使用过滤器。

过滤规则


假如现在已经有了一个规则,就像前面例子里的简单规则一样。应用程序的目标是输入用户的档案,检查用户的某些属性,根据这些属性来触发一些规则,如果规则的计算结果为真,则初始化一个新的Integer对象。然后在页面流(page flow))里,可以使用Integer值进行决策。

在规则引擎已经触发完所有规则并完成所有预定工作结束之后,会返回一个 Iterator对象,它描述了仍然保留在内存里的所有对象。可能没有必要关注内存里有哪些对象,例如用户档案、Request对象等,真正想从结果中得到的,可能只是Integer对象。所以我们需要对结果进行过滤。

对象过滤器是一个参数,可以在计算规则时传递给规则。如果使用规则控件,参数在控件的属性里指定。如果直接使用控制管理器 EJB ,参数在 evaluate() 方法的参数中指定。

可以用任何Java类或类集来构造 ObjectFilter,在本例里,我们直接使用RulesManager EJB,像下面这样建立过滤器:


      String rule = "myRule.rls";

      Class clazz = java.lang.Integer.class;

      ObjectFilter filter = new RuleResultClassFilter(rule, clazz);


有关 com.bea.p13n.rules.manager.RuleResultClassFilter 的详细介绍,请参考javadoc

如果正在使用RulesExecutorControl,那么是在该控件的属性里指定要过滤的类,如下所示:

/**

     * @common:control

    * @jc:rules-executor filterClassName="java.lang.Integer" filterResults="true"  rulesetUri="/rulesets/myRule.rls"

     */

    private com.bea.p13n.controls.rules.RulesExecutorControl rulesExecutorControl;

使用计算结果


现在,假设你已经建立了上面的简单规则,用RulesExecutorControl计算了规则,而且还过滤了计算结果。下面是在一个代码片段里它实际的使用情况:

import com.bea.p13n.usermgmt.profile.ProfileWrapper;

import com.bea.p13n.controls.*;

public class Controller extends PageFlowController

{

        /**

        * @common:control

        */

        private UserProfileControl profileControl;

/**

         * @common:control

        * @jc:rules-executor filterClassName="java.lang.Integer" filterResults="true"  rulesetUri="/rulesets/myRule.rls"

        */

         private com.bea.p13n.controls.rules.RulesExecutorControl

        --- other Actions go here ---

        /**

        * @jpf:action

        * @jpf:forward name="success" path="success.jsp"

        * @jpf:forward name="error" path="error.jsp"

        */

        protected Forward ruleAction()

{

try

{

        // First, get stuff into the working memory.  Let's get the user's city

        ProfileWrapper pw = profileControl.getProfileForUser("cindymc");

        String city = pw.getProperty("Addresses", "City");

// Get the results.  We already filtered on Integer for the results, so only Integer will

        // be in the results.  Should be only one.

        while (iter.hasNext())

        {

               Integer score = (Integer)iter.next();

               if (score.intValue() > 100)

               {

                       pw.setProperty("Scores", score);    // or whatever

               }

        }

}

catch (Exception e)

{

        return new Forward("error");

}

return new Forward("success");

}

}

结束语


Portal
规则服务为Portal应用程序提供了访问实时商业智能的方法。可以通过RulesManager EJB直接调用规则服务,也可以使用RulesExecutorControl调用。在Portal中,通过EJB调用规则服务已经可用了,但是对RulesExecutorControl控件的使用需要等到Portal SP3发布,其才会得到完全的支持。不过,虽然在SP3之前不支持规则控件,但是你可以从dev2dev上直接得到它。 

posted on 2005-06-06 15:48 笨笨 阅读(425) 评论(0)  编辑  收藏 所属分类: ALLWeblogic Portal

只有注册用户登录后才能发表评论。


网站导航: