JAVA隨筆

           

          規(guī)則容器的實(shí)現(xiàn)

          希望大家提出保貴意見~


          優(yōu)點(diǎn):

          1、規(guī)則規(guī)范業(yè)務(wù)流程,且現(xiàn)有規(guī)則已經(jīng)實(shí)現(xiàn)不僅使用在流程平臺上且可以其他模塊,如:作業(yè)計(jì)劃。僅需配置。
          2、支持xml中配置表達(dá)式,工程人員將輸入/輸出參數(shù)使用表達(dá)式配置進(jìn)行賦值(不需書寫任何代碼),故而影響流程的流向。
          3、支持xml中配置規(guī)則分組,并將規(guī)則賦予優(yōu)先級,規(guī)則會按照規(guī)則分組優(yōu)先級執(zhí)行規(guī)則,直到滿足規(guī)則條件退出。
          4、支持除表達(dá)式復(fù)雜的業(yè)務(wù)邏輯,工程人員可以開發(fā)java代碼實(shí)現(xiàn)業(yè)務(wù)方法,在xml中簡單配置即可以實(shí)現(xiàn)復(fù)雜業(yè)務(wù)邏輯。
          5、支持listener,在調(diào)用規(guī)則之前、之后都會觸發(fā)before(),after()方法。工程人員可按業(yè)務(wù)編寫多個lisener,使lisener有效只需要簡單xml配置。
          6、支持輸入輸出參數(shù)的驗(yàn)證,根據(jù)二次開發(fā)人員的xml配置,按輸入輸出參數(shù)配置類型進(jìn)行驗(yàn)證,若輸入/輸出參數(shù)不符合業(yè)務(wù)要求則拋出異常。

          發(fā)展:
          1、xml的web頁面配置,提供eclipse plugin配置,將需要手動xml配置的地方使用web,eclipse plugin的方式實(shí)現(xiàn)工具配置,
          其中可實(shí)現(xiàn),若需要判斷值,如執(zhí)行類型,工程人員在配置xml時(shí)每次要查數(shù)據(jù)庫對應(yīng)找出值配上,而現(xiàn)在只要求二次二發(fā)人員提供取數(shù)據(jù)庫表的方法,
          規(guī)則配置工具會將表中的內(nèi)存如:1,草稿;2,轉(zhuǎn)派;這些內(nèi)容以下拉列表方式供工程人員選對,以節(jié)省工程人員的麻煩。
          2、支持drools。
          3、與使用規(guī)則的組件更有機(jī)的結(jié)果,如流程平臺、作業(yè)計(jì)劃。

          依賴關(guān)系:
          1、文件配置
          2、castor
          3、ongl

          使用:
          規(guī)則關(guān)心的是輸入/輸出參數(shù),也即將輸入?yún)?shù)以java.util.Map傳入,通過key="參數(shù)名稱",value="參數(shù)類型"
          根據(jù)傳入的參數(shù)組合條件,將輸出參數(shù)以java.util.Map類型返回,也通過key="參數(shù)名稱",value="參數(shù)類型"

          以com.boco.eoms.commons.rule.test.service.RuleServiceFacadeTest.java 為例測試自定義java規(guī)則及規(guī)則分組調(diào)用

          為說明例子,我編寫了com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample.java及同包下的Rule1InputParameter2Sample.java
          做為輸入?yún)?shù)

          com.boco.eoms.commons.rule.Rule1OutputParameter1Sample.java及同包下Rule1OutputParameter2Sample.java做為輸出參數(shù)

          com.boco.eoms.commons.rule.Rule1Sample.java及com.boco.eoms.commons.rule.Rule2Sample.java為例說明自定義java規(guī)則及規(guī)則分組

          com.boco.eoms.commons.rule.sample.Rule1ListenerSample.java為自定義listener

          com.boco.eoms.commons.rule.sample.RuleSample.xml配置規(guī)則,先介紹輪廓,之后會詳細(xì)介紹

          rule的說明是個比較不好說明的東西,所以有些枯燥,:-)

          配置文件如下說明:

          <?xml version="1.0" encoding="UTF-8"?>
          <ruleEngine>
           
           <groups>
            <!--規(guī)則分組(路由)-->
            <group id="group1">
             <!-- 引用Rule2Sample,Rule1Sample兩個規(guī)則,優(yōu)先級為2,優(yōu)先級別以-1...正無窮遞增,即-1為最低優(yōu)先級,默認(rèn)規(guī)則優(yōu)先級為-1 -->
             <groupRef ruleId="Rule2Sample" pri="2" />
             <groupRef ruleId="Rule1Sample" pri="1" />
            </group>
           </groups>
           <!-- 表達(dá)式樣式 ,使用自定義java規(guī)則不需定義,先不用觀注-->
           <expStyles>
            <expStyle id="rule1Express"
             style=" ( $parameter != $l{springbean.getNames} || false ) &amp;&amp; $text ? $r{springbean.getName} : 3 " />
           </expStyles>
           <rules>
            <!-- 規(guī)則 className為規(guī)則包+類名 ,id為唯一標(biāo)識,記好了,將來調(diào)用時(shí)要用RuleId-->
            <rule className="com.boco.eoms.commons.rule.sample.Rule1Sample"
             id="Rule1Sample">
             <!-- 輸入?yún)?shù)定義 ,由使用規(guī)則組件的開發(fā)人員定義,rule1InputParameter1Sample為key,-->
             <!--類型為com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample,這里要定義正確呀,否則驗(yàn)證不通過,也不通路由的~-->
             <input>
              <parameter name="rule1InputParameter1Sample"
               type="com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample" />
              <parameter name="rule1InputParameter2Sample"
               type="com.boco.eoms.commons.rule.sample.Rule1InputParameter2Sample" />
             </input>
             <!-- 輸出參數(shù),expression為表達(dá)式,暫不關(guān)注,name及type和輸入?yún)?shù)一樣,drl是支持drools的預(yù)留接口,expStyleId表達(dá)式樣式ID,暫不關(guān)心-->
             <output>
              <parameter
               expression=""
               name="rule1OutputParameter1Sample"
               type="com.boco.eoms.commons.rule.sample.Rule1OutputParameter1Sample"
               drl=""
               expStyleId="rule1Express" />

              <parameter
               expression=""
               name="rule1OutputParameter2Sample"
               type="com.boco.eoms.commons.rule.sample.Rule1OutputParameter2Sample"
               drl=""
               expStyleId="rule1Express" />
             </output>
             <!--自定義listener,Rule1ListenerSample為自定義,RuleCheckListener為系統(tǒng)提供驗(yàn)證listener驗(yàn)證,若不需要驗(yàn)證將RuleCheckListener去掉即可(不推薦)-->
             <listeners>
              <listener
               name="com.boco.eoms.commons.rule.sample.Rule1ListenerSample" />
              <listener
               name="com.boco.eoms.commons.rule.listener.RuleCheckListener" />
             </listeners>
            </rule>

            <rule className="com.boco.eoms.commons.rule.sample.Rule2Sample"
             id="Rule2Sample">
             <input>
              <parameter name="rule1InputParameter1Sample"
               type="com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample" />
              <parameter name="rule1InputParameter2Sample"
               type="com.boco.eoms.commons.rule.sample.Rule1InputParameter2Sample" />
             </input>
             <output>
              <parameter
               expression=" ( ${rule1InputParameter1Sample.name} != 'value3' || false) &amp;&amp; true ? $b{springbean.getName} : 3 "
               name="rule1OutputParameter1Sample"
               type="com.boco.eoms.commons.rule.sample.Rule1OutputParameter1Sample"
               drl="classpath:com.boco.eoms.commons.rule.sample.rule1Parameter1Sample.drl"
               expStyleId="rule1Express" />

              <parameter
               expression=" rule1InputParameter1Sample.name != '234' &amp;&amp; rule1InputParameter1Sample.age >10 ? rule1InputParameter1Sample.name : rule1InputParameter1Sample.age "
               name="rule1OutputParameter2Sample"
               type="com.boco.eoms.commons.rule.sample.Rule1OutputParameter2Sample"
               drl="classpath:com.boco.eoms.commons.rule.sample.rule1Parameter2Sample.drl"
               expStyleId="rule1Express" />
             </output>
             <listeners>
             <listener
               name="com.boco.eoms.commons.rule.sample.Rule1ListenerSample" />
              <listener
               name="com.boco.eoms.commons.rule.listener.RuleCheckListener" />
             </listeners>
            </rule>
           </rules>
          </ruleEngine>


          OK,現(xiàn)在我們看看自定義java寫了什么


          public class Rule1Sample extends RuleService {

           /**
            * @param ruleListeners
            * @param rules
            * @param rule
            * @param xmlPath
            */
           public Rule1Sample(List ruleListeners, RuleEngine rules, Rule rule,
             String xmlPath) {
            super(ruleListeners, rules, rule, xmlPath);
           }

           /**
            * 二次開發(fā)人員需實(shí)現(xiàn)的業(yè)務(wù)接口
            *
            * @param map
            *            根據(jù)配置文件中input的配置,二次開發(fā)人員取出配置的參數(shù),
            *            如sample配置key="rule1InputParameter1Sample",value="com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample"
            *            key="rule1Parameter2InputSample",value="com.boco.eoms.commons.rule.sample.Rule1InputParameter2Sample"
            *            這時(shí)二次發(fā)人員在execute中按這種方式取參數(shù)
            *            com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample
            *            param1=(com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample)
            *            map.get("rule1InputParameter1Sample");
            *            com.boco.eoms.commons.rule.sample.Rule1InputParameter2Sample
            *            param2=(com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample)
            *            map.get("rule1InputParameter2Sample");
            *
            * @return 根據(jù)配置文件output的配置,二次開發(fā)人員需返回配置的參數(shù) 如sample配置
            *         key="rule1OutputParameter1Sample",value="com.boco.eoms.commons.rule.sample.Rule1OutputParameter1Sample"
            *         key="rule1OutputParameter2Sample",value="com.boco.eoms.commons.rule.sample.Rule1OutputParameter2Sample"
            *         配置人員需按業(yè)務(wù)要求,返回
            *         map.put("rule1OutputParameter1Sample",com.boco.eoms.commons.rule.sample.Rule1OutputParameter1Sample);
            *         map.put("rule1OutputParameter2Sample",com.boco.eoms.commons.rule.sample.Rule1OutputParameter2Sample);
            *         return map;
            * @throws RuleException
            */
           public Map execute(Map map,Rule rule) throws RuleException {
            // 規(guī)則業(yè)務(wù)
            // 取輸入?yún)?shù)
            Rule1InputParameter1Sample inputParam1 = (Rule1InputParameter1Sample) map
              .get("rule1InputParameter1Sample");
            Rule1InputParameter2Sample inputParam2 = (Rule1InputParameter2Sample) map
              .get("rule1InputParameter2Sample");

            Map outMap = new HashMap();
            Rule1OutputParameter1Sample outParam1 = new Rule1OutputParameter1Sample();
            Rule1OutputParameter2Sample outParam2 = new Rule1OutputParameter2Sample();
            // 模擬規(guī)則,年齡大于10數(shù),姓名不為匿名,則outParam1設(shè)為可通過
            if (inputParam1.getAge() > 10
              && !"anonym".equals(inputParam1.getName())) {
             // 為說明業(yè)務(wù)邏輯所以將setName放入判斷條件
             outParam1.setName(inputParam1.getName());
             outParam1.setOk(true);
            } else {
             // 為說明業(yè)務(wù)邏輯所以將setName放入判斷條件
             outParam1.setName(inputParam1.getName());
             outParam1.setOk(false);
            }
            // 性別為男則通過
            if ("male".equals(inputParam2.getSex())) {
             outParam2.setSex("male");
             outParam2.setOk(true);
            } else {
             outParam2.setSex("male");
             outParam2.setOk(false);
            }
            outMap.put("rule1OutputParameter1Sample", outParam1);
            outMap.put("rule1OutputParameter2Sample", outParam2);
            // 返回輸出參數(shù)
            return outMap;
           }

          }

          以Rule1Sample.java為例,需繼承RuleService并實(shí)現(xiàn)execute方法,業(yè)務(wù)邏輯寫在該方法內(nèi),如Rule1Sample.java

          按照配置的輸入/輸出參數(shù)進(jìn)行操作。

          同時(shí)開發(fā)人員需要 像RuleServiceFacadeTest這樣調(diào)用,按注釋調(diào)用,請看注釋

           


          public class RuleServiceFacadeTest extends TestCase {
           private RuleServiceFacade facade;

           private Map<String, Object> inputMap;

           private Rule1InputParameter1Sample inputParam1;

           private Rule1InputParameter2Sample inputParam2;

           private String xmlPath = "";

           private String groupId = "";

           /**
            * 輸入?yún)?shù)初始化
            */
           protected void setUp() throws Exception {
            facade = RuleServiceFacade.create();
            // 測試輸入?yún)?shù)類弄與xml是否匹配
            inputMap = new HashMap<String, Object>();
            inputParam1 = new Rule1InputParameter1Sample();
            inputParam2 = new Rule1InputParameter2Sample();
            inputParam1.setAge(10);
            inputParam1.setName("qjb");
            inputParam2.setSex("male");

            inputMap.put("rule1InputParameter1Sample", inputParam1);
            inputMap.put("rule1InputParameter2Sample", inputParam2);
            xmlPath = "classpath:com/boco/eoms/commons/rule/sample/RuleSample.xml";
            groupId = "group1";
            super.setUp();
           }

           protected void tearDown() throws Exception {
            super.tearDown();
           }

           /**
            * 以classpath:com/boco/eoms/commons/rule/sample/RuleSample.xml為配置文件,調(diào)用rule1Sample為ruleId,以inputMap為輸入?yún)?shù),
            *
            */
           public void testInvokeRuleService() {
            try {
             facade.invokeRuleService(xmlPath, "Rule1Sample", inputMap);
            } catch (RuleException e) {
             fail();
            }
           }

           /**
            * 以規(guī)則分組(路由)方式調(diào)用,調(diào)用groupId即group1,按照xml配置是調(diào)用了兩個rule,按照優(yōu)先級(數(shù)字由大到小)先后調(diào)用
            * 以不同輸入?yún)?shù)調(diào)用
            */
           public void testInvokeRuleGroupForDiffInputMap() {

            Map<String, Map> map = new HashMap<String, Map>();
            Map outMap = null;
            // 以不同輸入?yún)?shù)調(diào)用
            map.put("Rule1Sample", inputMap);
            map.put("Rule2Sample", inputMap);
            try {
             outMap = facade.invokeRuleGroupForDiffInputMap(xmlPath, groupId,
               map);

            } catch (RuleException e) {
             fail();
            }
            checkOutMap(outMap);
           }

           /**
            * 以規(guī)則分組(路由)方式調(diào)用,調(diào)用groupId即group1,按照xml配置是調(diào)用了兩個rule,按照優(yōu)先級(數(shù)字由大到小)先后調(diào)用
            * 以相同輸入?yún)?shù)調(diào)用
            *
            */
           public void testInvokeRuleGroupForSampeInputMap() {
            Map outMap = null;
            try {
             outMap = facade.invokeRuleGroupForSampeInputMap(xmlPath, groupId,
               inputMap);
            } catch (RuleException e) {
             e.printStackTrace();
             fail();
            }
            checkOutMap(outMap);
           }

           /**
            * 驗(yàn)證輸出參數(shù),用于測試
            *
            * @param outMap
            */
           private void checkOutMap(Map outMap) {
            Rule1OutputParameter2Sample outPram2 = (Rule1OutputParameter2Sample) outMap
              .get("rule1OutputParameter2Sample");
            assertEquals(outPram2.getSex(), "male");
            assertEquals(outPram2.isOk(), true);
           }
          }

          這時(shí)再看自定義的listener

          com.boco.eoms.commons.rule.sample.Rule1ListenerSample.java

           

          public class Rule1ListenerSample implements IRuleListener {

           private Logger logger = Logger.getLogger(this.getClass());

           /**
            * 執(zhí)行規(guī)則后調(diào)用
            */
           public void after(Map inputMap, Rule rule) throws RuleException {
            logger.debug(rule.getId() + " after");

           }

           /**
            * 執(zhí)行規(guī)則前調(diào)用
            */
           public void before(Map outputMap, Rule rule) throws RuleException {
            logger.debug(rule.getId() + " before");
           }
          }

          需要實(shí)現(xiàn)IRuleListener.java的after及before方法

          ok,運(yùn)行com.boco.eoms.commons.rule.RuleServiceFacadeTest.java測試用例。

          暈了吧~,重新看下,OK,以上內(nèi)容為自定義調(diào)用,下面說說表達(dá)式方式調(diào)用

           

           

           

          以com.boco.eoms.commons.rule.test.service.ExpressionRuleServiceTest.java 為例測試表達(dá)式的規(guī)則


          按com.boco.eoms.commons.rule.sample.ExpressionRuleSample.xml中配置

          <?xml version="1.0" encoding="UTF-8"?>
          <ruleEngine>
           <!-- 表達(dá)式樣式,用于規(guī)則工具定義,暫不關(guān)心 -->
           <expStyles>
            <expStyle id="rule1Express"
             style=" ( $parameter != $l{springbean.getNames} || false ) &amp;&amp; $text ? $r{springbean.getName} : 3 " />
           </expStyles>
           <rules>
            <!-- 這里一定要配className="com.boco.eoms.commons.rule.service.ExpressionRuleService"這個類,表達(dá)式類-->
            <rule
             className="com.boco.eoms.commons.rule.service.ExpressionRuleService"
             id="ExpressionRule">
             <!-- 輸入?yún)?shù)定義 ,由使用規(guī)則組件的開發(fā)人員定義,rule1InputParameter1Sample為key,-->
             <!--類型為com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample,這里要定義正確呀,否則驗(yàn)證不通過,也不通路由的~-->
             <input>
              <parameter name="rule1InputParameter1Sample"
               type="com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample" />
              <parameter name="rule1InputParameter2Sample"
               type="com.boco.eoms.commons.rule.sample.Rule1InputParameter2Sample" />
             </input>
             <!-- 輸出參數(shù),expression為表達(dá)式,暫不關(guān)注,name及type和輸入?yún)?shù)一樣,drl是支持drools的預(yù)留接口,expStyleId表達(dá)式樣式ID,暫不關(guān)心-->
             <output>
              <!--expression 表達(dá)式 rule1InputParameter1Sample.age指com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample中的getAge()方法。 -->
              <!-- 其中&amp;&amp;在讀入程序時(shí),將用&&(與)替換, -->
              <!-- 解釋一下,其中要使用輸入?yún)?shù)必須要以"#"號開頭
              rule1InputParameter1Sample 及rule2InputParameter1Sample從map中取出(這里開發(fā)人員不必關(guān)心,由規(guī)則幫你處理)
              
              if(rule1InputParameter1Sample.getAge()>5 && "qjb".equals(rule1InputParameter1Sample.getName()){
               return rule1InputParameter1Sample.getResult();
              }
              else{
               return rule1InputParameter1Sample.getStr(rule1InputParameter1Sample.getName());
              }
              
              規(guī)則容器將返回值寫入輸出map中,以name=rule1OutputParameter1Sample為key值,value即為返回值
              -->
              <parameter
               expression="#rule1InputParameter1Sample.age>5 &amp;&amp; #rule1InputParameter1Sample.name=='qjb'?#rule1InputParameter1Sample.result:#rule1InputParameter1Sample.getStr(#rule1InputParameter1Sample.name)"
               name="rule1OutputParameter1Sample"
               type="java.lang.String"
               drl="" expStyleId="" />


              <!-- 再來解釋下第二個輸出參數(shù)表達(dá)式
               
               if(rule1InputParameter1Sample.getAge()>5)){
                rule1InputParameter1Sample.setAge(5);
               }
               else{
                rule1InputParameter1Sample.setAge(6);
               }
               return rule1InputParameter1Sample;
              -->
              <parameter
               expression="#rule1InputParameter1Sample.age>5?#rule1InputParameter1Sample.setAge(5):#rule1InputParameter1Sample.setAge(6),#rule1InputParameter1Sample"
               name="rule1OutputParameter2Sample"
               type="com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample"
               drl="" expStyleId="" />
             </output>
             <!--listener第一個例子,不需要表達(dá)式配置功能一樣-->
             <listeners>
              <listener
               name="com.boco.eoms.commons.rule.sample.Rule1ListenerSample" />
              <listener
               name="com.boco.eoms.commons.rule.listener.RuleCheckListener" />
             </listeners>
            </rule>
           </rules>
          </ruleEngine>

          運(yùn)行com.boco.eoms.commons.rule.test.service.ExpressionRuleServiceTest.java測試用例

          仔細(xì)看下測試用例,應(yīng)該很好理解,

          恭喜,恭喜,熟練掌握rule了吧?:-)

           

          痛苦的再寫下去,再說說rule的擴(kuò)展吧~

          基于rule去擴(kuò)展是很簡單的~

          舉個例子,其實(shí)表達(dá)式的支持,就是我擴(kuò)展的一個類,看下
          com.boco.eoms.commons.rule.service.ExpressionRuleService.java

          public class ExpressionRuleService extends RuleService {

           @Override
           protected Map<String, Object> execute(Map<String, Object> inputMap,
             Rule rule) throws RuleException {
            // 創(chuàng)建表達(dá)式解析service
            OgnlExpressionService oes = OgnlExpressionService.create(null);
            Map<String, Object> outMap = new HashMap<String, Object>();
            // 取輸出參數(shù)
            for (Iterator it = rule.getOutput().getParameters().iterator(); it
              .hasNext();) {

             Parameter para = (Parameter) it.next();
             // 將輸出參數(shù)配置的表達(dá)式結(jié)果按照配置名稱寫入outMap
             outMap.put(para.getName(), oes.getValue(para.getExpression(),
               inputMap));

            }

            return outMap;
           }

           /**
            * @param ruleListeners
            * @param rules
            * @param rule
            * @param xmlPath
            */
           public ExpressionRuleService(List ruleListeners, RuleEngine rules,
             Rule rule, String xmlPath) {
            super(ruleListeners, rules, rule, xmlPath);
           }

          }


          看下,沒什么內(nèi)容吧,只需繼承RuleService,重寫execute方法,在里面實(shí)現(xiàn)你的業(yè)務(wù)邏輯,
          其實(shí)就是自定義規(guī)則,但也可以寫成通用的呀。就像將來要擴(kuò)展的drools一樣,將來新增個
          DroolsRuleService就OK了。這時(shí)在xml配置時(shí),在className配置剛剛寫的DroolsRuleService的類就OK了。
          這樣就實(shí)現(xiàn)了對drools的支持

            <rule
             className="com.boco.eoms.commons.rule.service.ExpressionRuleService"
             id="ExpressionRule">
             <!-- 輸入?yún)?shù)定義 ,由使用規(guī)則組件的開發(fā)人員定義,rule1InputParameter1Sample為key,-->
             <!--類型為com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample,這里要定義正確呀,否則驗(yàn)證不通過,也不通路由的~-->
             <input>
              <parameter name="rule1InputParameter1Sample"
               type="com.boco.eoms.commons.rule.sample.Rule1InputParameter1Sample" />
              <parameter name="rule1InputParameter2Sample"
               type="com.boco.eoms.commons.rule.sample.Rule1InputParameter2Sample" />
             </input>
           
           
          再說說監(jiān)聽,有人說你的監(jiān)聽不是沒用的嗎,我要實(shí)現(xiàn)自定義業(yè)務(wù)邏輯,只需在execute方法最前端及后端加上我要在listener中要做的事,
          這不一樣能解決嗎,OK,我們來看下,完全沒錯,可以解決,除非你想將listener的東西藕荷在業(yè)務(wù)邏輯,當(dāng)然listener的before(),after()方法
          不包含你的業(yè)務(wù)邏輯。再說下,若你不實(shí)現(xiàn)自定義規(guī)則呢,你怎么實(shí)現(xiàn)在before(),after()方法的內(nèi)容呢,哈哈。再以一個例子說明,其實(shí)rule的
          參數(shù)驗(yàn)證機(jī)制就是一個listener實(shí)現(xiàn)的,看一下com.boco.eoms.rule.listener.RuleCheckListener.java


          public class RuleCheckListener implements IRuleListener {

           public void after(Map map, Rule rule) throws RuleException {
            // 取輸入?yún)?shù)
            for (Iterator outputIt = rule.getOutput().getParameters().iterator(); outputIt
              .hasNext();) {
             Parameter para = (Parameter) outputIt.next();
             // 驗(yàn)證map中的所存的對象與xml配置是否相符
             RuleConfigWrapper.checkMapType(map, para);
            }

           }

           public void before(Map map, Rule rule) throws RuleException {
            // 取輸入?yún)?shù)
            for (Iterator inputIt = rule.getInput().getParameters().iterator(); inputIt
              .hasNext();) {
             Parameter para = (Parameter) inputIt.next();
             // 驗(yàn)證map中的所存的對象與xml配置是否相符
             RuleConfigWrapper.checkMapType(map, para);
            }

           }

          }

          這就是輸入/輸出參數(shù)與xml配置的驗(yàn)證呀,呵呵~

          OK,現(xiàn)在編寫你的listenr吧

          只需實(shí)現(xiàn)IRuleListener,并實(shí)現(xiàn)after(),befor()方法,

          配置時(shí)在xml中配置,貼一段

           


             
             <listeners>
              <listener
               name="com.boco.eoms.commons.rule.sample.Rule1ListenerSample" />
              <listener
               name="com.boco.eoms.commons.rule.listener.RuleCheckListener" />
             </listeners>
             
             
             
          很簡單吧~

          posted on 2007-04-28 09:49 曲靜波 閱讀(1344) 評論(0)  編輯  收藏 所屬分類: others

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類(9)

          隨筆檔案(8)

          文章分類

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宁城县| 延津县| 平果县| 开远市| 上蔡县| 滨州市| 新源县| 阿拉善右旗| 鹤庆县| 西宁市| 阿克陶县| 彭泽县| 南安市| 延津县| 浙江省| 集贤县| 玛多县| 岚皋县| 阳江市| 万宁市| 东安县| 阿城市| 类乌齐县| 石家庄市| 榆林市| 沛县| 安宁市| 清流县| 类乌齐县| 永康市| 洞口县| 广宗县| 德州市| 永德县| 台湾省| 满洲里市| 长泰县| 济宁市| 自贡市| 惠来县| 南溪县|