当柳上原的风吹向天际的时候...

真正的快乐来源于创造

  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.blogjava.net/Files/heyang/JavaCompute0922_01.rar
posted @ 2011-09-22 16:21 何杨 阅读(1748) | 评论 (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 何杨 阅读(841) | 评论 (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 何杨 阅读(554) | 评论 (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 何杨 阅读(536) | 评论 (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.blogjava.net/Files/heyang/ESqlTest0920_02.rar
posted @ 2011-09-21 11:29 何杨 阅读(741) | 评论 (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.blogjava.net/Files/heyang/ESqlTest0920_01.rar
posted @ 2011-09-21 10:59 何杨 阅读(688) | 评论 (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 何杨 阅读(539) | 评论 (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.blogjava.net/Files/heyang/InputOutputTest0919.rar

-The End-
posted @ 2011-09-20 10:34 何杨 阅读(561) | 评论 (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 何杨 阅读(820) | 评论 (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 何杨 阅读(732) | 评论 (2)编辑 收藏

仅列出标题
共28页: First 上一页 7 8 9 10 11 12 13 14 15 下一页 Last