當柳上原的風吹向天際的時候...

          真正的快樂來源于創造

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks

          #

          任務:使用JavaCompute節點進行XML轉化

          一.如圖建立Flow


          二.編輯JavaCompute節點的Java代碼如下:
          import com.ibm.broker.javacompute.MbJavaComputeNode;
          import com.ibm.broker.plugin.*;


          public class flow_JavaCompute extends MbJavaComputeNode {

              
          public void evaluate(MbMessageAssembly inassembly) throws MbException {
                  MbOutputTerminal out 
          = getOutputTerminal("out");
                  
          // MbOutputTerminal alt = getOutputTerminal("alternate");

                  MbMessage inMessage 
          = inassembly.getMessage();
                  MbMessage outMessage 
          = new MbMessage(inMessage);
                  MbMessageAssembly outAssembly
          =new MbMessageAssembly(inassembly,outMessage);
                  
                  MbElement root
          =outMessage.getRootElement();
                  MbElement rootElm
          =root.getLastChild().getFirstChild();

                  MbElement employee1
          =rootElm.createElementAsLastChild(MbElement.TYPE_NAME,"empoyee",null);
                  employee1.setValue(
          "Andy");
                  
                  MbElement employee2
          =rootElm.createElementAsLastChild(MbElement.TYPE_NAME,"empoyee",null);
                  employee2.setValue(
          "Bill");
                  MbElement id 
          = employee2.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE,"id""221415");
                  
                  out.propagate(outAssembly);
                  outMessage.clearMessage();
              }

          }

          三.輸入XML如下
          <employees><employee>Hy</employee></employees>

          四.輸出XML如下:
          <employees><employee>Hy</employee><empoyee>Andy</empoyee><empoyee id="221415">Bill</empoyee></employees>
          注意這里面的代碼操作與我們常見XML很不一樣,一個是取根節點處,一個是給節點設置值處,一個是給節點增加屬性處。

          五.工程從這里下載
          http://www.aygfsteel.com/Files/heyang/JavaCompute0922_01.rar
          posted @ 2011-09-22 16:21 何楊 閱讀(1771) | 評論 (0)編輯 收藏

          ESQL:
          CREATE COMPUTE MODULE flow_Compute
              
          CREATE FUNCTION Main() RETURNS BOOLEAN
              
          BEGIN
                  
          SET OutputRoot.XML.employee.uuid = UUIDASCHAR;
                  
          SET OutputRoot.XML.employee.uuid2 = UUIDASBLOB;
                  
                  
          SET OutputRoot.XML.employee.(XML.Attribute)id ='123';
                  
          SET OutputRoot.XML.employee.name = 'Felix';
                  
          SET OutputRoot.XML.employee.age = 33;

                  
          SET OutputRoot.XML.employee.address[1] = 'Dalian 88';
                  
          SET OutputRoot.XML.employee.address[2] = 'Beijing 188';
                  
          SET OutputRoot.XML.employee.address[3] = 'Shanghai 288';

                  
          SET OutputRoot.XML.employee.title.VALUE = NULL;
                  
                  
          SET OutputRoot.XML.employee.salary VALUE = NULL;

                  
          SET OutputRoot.XML.employee.Comments.(XML.Content)=NULL;

                  
          RETURN TRUE;
              
          END;
          END MODULE;

          Result XML:
          <employee id="123"><uuid>1d1932fe-b2a9-484d-8d32-e70440288914</uuid><uuid2>239143b0384e46ff9bb50a34c8b28732</uuid2><name>Felix</name><age>33</age><address>Dalian 88</address><address>Beijing 188</address><address>Shanghai 288</address><title/><salary></salary><Comments/></employee>
          posted @ 2011-09-21 16:52 何楊 閱讀(855) | 評論 (0)編輯 收藏

          Compute節點的ESQL是:
          CREATE COMPUTE MODULE flow_Compute
              
          CREATE FUNCTION Main() RETURNS BOOLEAN
              
          BEGIN
                  
          -- XML操作示例

                  
          SET OutputRoot.XML.employee.(XML.Attribute)id = '001';
                  
          SET OutputRoot.XML.employee.name = 'Felix';
                  
          SET OutputRoot.XML.employee.age = 33;

                  
          SET OutputRoot.XML.employee.address[1] = 'Dalian 88';
                  
          SET OutputRoot.XML.employee.address[2] = 'Beijing 188';
                  
          SET OutputRoot.XML.employee.address[3] = 'Shanghai 288';

                  
          SET OutputRoot.XML.employee.title.VALUE = NULL;
                  
                  
          SET OutputRoot.XML.employee.salary VALUE = NULL;

                  
          SET OutputRoot.XML.employee.Comments.(XML.Content)=NULL;

                  
          RETURN TRUE;
              
          END;
          END MODULE;

          最終得到的XML是:
          <employee id="001"><name>Felix</name><age>33</age><address>Dalian 88</address><address>Beijing 188</address><address>Shanghai 288</address><title/><salary></salary><Comments/></employee>

          工程下載:
          posted @ 2011-09-21 16:13 何楊 閱讀(564) | 評論 (0)編輯 收藏

          任務:給根節點加上屬性。

          步驟:
          仍然是使用一個MQ input節點,一個MQ output節點和一個Compute節點,Compute節點的ESql如下:
          CREATE COMPUTE MODULE flow_Compute
              
          CREATE FUNCTION Main() RETURNS BOOLEAN
              
          BEGIN
                  
          SET OutputRoot = InputRoot;
                  
                  
          DECLARE Count Integer 0;
                  
          SET Count=CARDINALITY(InputRoot.XML.employees.employee[]);
                  
                  
          SET OutputRoot.XML.employees.(XML.Attribute)count=Count;
                  
                  
          RETURN TRUE;
              
          END;
          END MODULE;

          上圖粗體部分為關鍵,它的作用是給employees節點增加了一個屬性Count.

          輸入的XML分別如下:
          <employees><employee><id>001</id><name>張飛</name><age>28</age></employee><employee><id>002</id><name>關羽</name><age>29</age></employee><employee>    <id>003</id><name>趙云</name><age>30</age></employee></employees>

          輸入和輸出的XML分別如下:
          <employees count="3"><employee><id>001</id><name>張飛</name><age>28</age></employee><employee><id>002</id><name>關羽</name><age>29</age></employee><employee>    <id>003</id><name>趙云</name><age>30</age></employee></employees>

          工程下載:
          posted @ 2011-09-21 13:22 何楊 閱讀(555) | 評論 (0)編輯 收藏

          其它和前例一樣,但遍歷代碼如下:


          CREATE COMPUTE MODULE flow_Compute
              
          CREATE FUNCTION Main() RETURNS BOOLEAN
              
          BEGIN
                  
          -- 員工總數
                  DECLARE Count INTEGER 0;
                  
          -- 得到XML中員工總數
                  SET Count=CARDINALITY(InputRoot.XML.employees.employee[]);
                  
                  
          -- 員工姓名匯總
                  DECLARE Names CHARACTER;
                  
          SET Names='';
                          
                  
          -- 最大年齡
                  DECLARE MaxAge INTEGER 0;
                  
                  
          -- 年齡合計
                  DECLARE SumAge INTEGER 0;
                  
                  
          -- 當前年齡
                  DECLARE CurrAge INTEGER 0;
                  
                  
          -- 循環變量        
                  FOR CurrItem AS InputRoot.XML.employees.employee[] DO
                      
          -- 字符串拼接 
                      SET Names=Names || CurrItem.name ;
                      
          SET Names=Names || ',';
                      
                      
          -- 字符串轉換成整數再進行年齡合計 
                      SET CurrAge = CAST(CurrItem.age AS INTEGER);
                      
          SET SumAge=SumAge+CurrAge;
                      
                      
          -- 得到最大年齡
                      IF MaxAge<CurrAge THEN
                          
          SET MaxAge=CurrAge;
                      
          END IF;
                  
          END FOR;
                  
                  
                  
          -- 平均年齡
                  DECLARE AvgAge FLOAT;
                  
          SET AvgAge=SumAge/Count;
                  
                  
          -- 拼接輸出XML
                  SET OutputRoot.XML.summary.count=Count;
                  
          SET OutputRoot.XML.summary.names=Names;
                  
          SET OutputRoot.XML.summary.maxAge=MaxAge;
                  
          SET OutputRoot.XML.summary.avgAge=CAST(AvgAge AS CHARACTER);
                  
                  
          RETURN TRUE;
              
          END;

          END MODULE;

          相比較而言,這種方式更簡潔方便。

          下載地址:
          http://www.aygfsteel.com/Files/heyang/ESqlTest0920_02.rar
          posted @ 2011-09-21 11:29 何楊 閱讀(752) | 評論 (0)編輯 收藏

          任務:將如下輸入XML變成如下輸出XML
          輸入XML:
          <employees><employee><id>001</id><name>張飛</name><age>28</age></employee><employee><id>002</id><name>關羽</name><age>29</age></employee><employee>    <id>003</id><name>趙云</name><age>30</age></employee></employees>

          輸出XML:
          <summary><count>3</count><names>張飛,關羽,趙云,</names><maxAge>30</maxAge><avgAge>2.9E+1</avgAge></summary>

          我們需要做一個Input節點和一個Output節點以及一個Comput節點,并設置Compute節點的ESQL如下:
          CREATE COMPUTE MODULE flow_Compute
              
          CREATE FUNCTION Main() RETURNS BOOLEAN
              
          BEGIN
                  
          -- 員工總數
                  DECLARE Count INTEGER 0;
                  
          -- 得到XML中員工總數
                  SET Count=CARDINALITY(InputRoot.XML.employees.employee[]);
                  
                  
          -- 員工姓名匯總
                  DECLARE Names CHARACTER;
                  
          SET Names='';
                          
                  
          -- 最大年齡
                  DECLARE MaxAge INTEGER 0;
                  
                  
          -- 年齡合計
                  DECLARE SumAge INTEGER 0;
                  
                  
          -- 當前年齡
                  DECLARE CurrAge INTEGER 0;
                  
                  
          -- 循環變量        
                  DECLARE I INTEGER 1;
                  
          WHILE I<=Count DO
                      
          -- 字符串拼接
                      SET Names=Names || InputRoot.XML.employees.employee[I].name ;
                      
          SET Names=Names || ',';
                      
                      
          -- 字符串轉換成整數再進行年齡合計
                      SET CurrAge = CAST(InputRoot.XML.employees.employee[I].age AS INTEGER);
                      
          SET SumAge=SumAge+CurrAge;
                      
                      
          -- 得到最大年齡
                      IF MaxAge<CurrAge THEN
                          
          SET MaxAge=CurrAge;
                      
          END IF;
                      
                      
          SET I=I+1;
                  
          END WHILE;
                  
                  
          -- 平均年齡
                  DECLARE AvgAge FLOAT;
                  
          SET AvgAge=SumAge/Count;
                  
                  
          -- 拼接輸出XML
                  SET OutputRoot.XML.summary.count=Count;
                  
          SET OutputRoot.XML.summary.names=Names;
                  
          SET OutputRoot.XML.summary.maxAge=MaxAge;
                  
          SET OutputRoot.XML.summary.avgAge=CAST(AvgAge AS CHARACTER);
                  
                  
          RETURN TRUE;
              
          END;

          END MODULE;

          本例工程下載地址:
          http://www.aygfsteel.com/Files/heyang/ESqlTest0920_01.rar
          posted @ 2011-09-21 10:59 何楊 閱讀(700) | 評論 (0)編輯 收藏

          任務:由于上一節傳遞到OutQ和OutQ1中的地址仍為原來的形式,現需要修改成對應的文字,即把
          <address>大連/上海</address>變成<address>大連</address>或<address>上海</address>的形式。

          1.修改Compute節點的ESQL,增加修改輸出XML的一句:


          CREATE COMPUTE MODULE flow_Compute
              
          CREATE FUNCTION Main() RETURNS BOOLEAN
              
          BEGIN
                  
                  
          DECLARE Address CHARACTER;
                  
          DECLARE Addresses CHARACTER InputRoot.XML.mail.address;
                  
          DECLARE I INTEGER 0;
                  
          DECLARE J INTEGER;
                  
          DECLARE LEN INTEGER LENGTH(Addresses);
                  
                  
          WHILE (I<LEN) DO
                      
          SET OutputRoot = InputRoot;
                      
          SET J=I+1;
                      
          SET Address=SUBSTRING(Addresses FROM J FOR 2);
                      
                      
          SET OutputRoot.XML.mail.address=Address;-- 修改輸出的地址部分
                      SET OutputLocalEnvironment.Destination.RouterList.DestinationData[1].labelName = Address;
                  
                      PROPAGATE;
                      
          SET I=J+2;
                  
          END WHILE;
                  
                  
          RETURN FALSE;
              
          END;

          END MODULE;


          2.下圖顯示了修改地址后的結果:


          -The End-
          posted @ 2011-09-20 10:51 何楊 閱讀(557) | 評論 (0)編輯 收藏

          任務:ESQL中字符串處理


          1.繼續沿用上次的工程,注意修改兩個Label節點的Label Name為漢字形式,并改寫Compute節點的ESQL如下:
          CREATE COMPUTE MODULE flow_Compute
              
          CREATE FUNCTION Main() RETURNS BOOLEAN
              
          BEGIN
                  
                  
          DECLARE Address CHARACTER;
                  
          DECLARE Addresses CHARACTER InputRoot.XML.mail.address;
                  
          DECLARE I INTEGER 0;
                  
          DECLARE J INTEGER;
                  
          DECLARE LEN INTEGER LENGTH(Addresses);
                  
                  
          WHILE (I<LEN) DO
                      
          SET OutputRoot = InputRoot;
                      
          SET J=I+1;
                      
          SET Address=SUBSTRING(Addresses FROM J FOR 2);
                      
          SET OutputLocalEnvironment.Destination.RouterList.DestinationData[1].labelName = Address;
                  
                      PROPAGATE;
                      
          SET I=J+2;
                  
          END WHILE;
                  
                  
          RETURN FALSE;
              
          END;

          END MODULE;

          2.將以下文本傳入InQ:
          <mail><id>0001</id><address>大連/上海</address></mail>

          3.OutQ和OutQ1都將收到信息,如下圖顯示。




          4.本例工程下載地址
          http://www.aygfsteel.com/Files/heyang/InputOutputTest0919.rar

          -The End-
          posted @ 2011-09-20 10:34 何楊 閱讀(573) | 評論 (0)編輯 收藏

          任務:熟悉RouteToLabel節點,Label節點及Catch的使用

          1.RouteToLabel節點在Routing下,與Filter節點在一起,label節點也在里面。如下圖拖拽出一個RouteToLabel節點,兩個Label節點。


          2.再增加一個MQ Output節點Mq output2,關聯到OutQ3。這個節點作用是當Compute導向出現異常(如address是深圳)時將信息發到OutQ3上。注意MQ
          Mq output2到Mq Input的連線的起點和終點。


          3.設置Compute節點的Compute Mode類型為ALL,這是為了在其中書寫新的ESQL做的準備。


          4.編輯Compute節點的新的ESQL。

          SET OutputLocalEnvironment.Destination.RouterList.DestinationData[1].labelName = InputRoot.XML.mail.address;
          這條語句會查看輸入XML的mail節點的address節點的內容,如果能找到對應(mail節點的address節點的內容==Label節點的Label Name)的Label節點,則將消息導向到這個Label的后端;如果找不到的話,則將信息導向到Compute節點來源節點的catch端。

          5.設置Label節點一(大連)的Label Name。


          6.設置Label節點二(上海)的Label Name。


          7.給各條連線加上斷點,用以觀察消息的流向。


          8.當消息為“<mail><id>0001</id><address>dalian</address></mail>”時,如愿,消息被導向到了MQ Output。


          -The End-
          posted @ 2011-09-19 17:13 何楊 閱讀(837) | 評論 (0)編輯 收藏

          任務:熟悉Filter節點的使用。

          1.Filter節點在Routing菜單下。


          2.增加一個Filter節點和一個Output節點(與OutQ1關聯),并如下連線。注意Filter的出口,MQ output是連到False口,而MQ Output1是連到true口。


          3.連線完畢后Filter節點出現錯誤狀態,此時我們需要編輯其ESQL,附帶也把Compute節點的ESQL也編輯一下。


          4.以下是Compute節點和Filter節點的新SQL。


          5.啟動測試后,向InQ輸入XML文本如下:



          6.OutQ1收到了轉化分流后的結果,其內容正是我們想要的。


          7.讓我們改變一下小明的分數再測試一下:


          8.結果如ESQL所料,OutQ得到了最終的信息。


          -The end-
          posted @ 2011-09-19 15:42 何楊 閱讀(751) | 評論 (2)編輯 收藏

          僅列出標題
          共28頁: First 上一頁 7 8 9 10 11 12 13 14 15 下一頁 Last 
          主站蜘蛛池模板: 东光县| 东乌珠穆沁旗| 迁西县| 鹤岗市| 潞西市| 荔波县| 长垣县| 镇平县| 凉山| 乐至县| 新源县| 克山县| 衢州市| 江津市| 绥宁县| 莎车县| 齐齐哈尔市| 黔江区| 平昌县| 松桃| 兴隆县| 克什克腾旗| 茌平县| 永新县| 庆阳市| 集贤县| 曲靖市| 高淳县| 祁连县| 宜都市| 平和县| 兴城市| 镇坪县| 黎川县| 宁津县| 荃湾区| 茶陵县| 交口县| 合川市| 旬阳县| 宜丰县|