MB备忘----3

做完消息集,现在来做消息流。

切换到[代理应用开发视图]进行一个最简单的流开发。Queue-----Queue,不用进行任何转换。当然,这个时候默认的消息域是BLOB,常用的是MRM(要配合消息定义等等)。这种例子到处都是,就不再啰嗦。

 

研究消息流的时候,注重研究MB提供的常用的节点和消息的逻辑树结构(这一点非常重要,几乎是MB的灵魂所在)。

现在研究消息逻辑树结构:

一,Message(Properties,[MQMD],Headers,Body)

二,Environment(Variables)

三,LocalEnvironment(Variables,Destination,WrittenDestination)

四,ExceptionList

下面我们仔细研究:

 

消息逻辑树:Message

根为ROOT,下面有Properties和MQMD(如果用其它通信方式,换为相应的头)、消息头及消息体Body。
属性域要设置消息集MessageSet(消息集名称)、MessageType(消息名称)、MessageFormat(物理格式,这与消息集定义时的物理格式有关,写相应的名称便可,一般为XML1,CWF1,TDS.....之类的)、Encoding、CodedCharSet等等,可以查看帮助文档得知。

用ESQL解析消息时,不同节点根的名称有所不同,

不能改变消息内容的一般都为Root,后面跟消息解析器名称如XML等等,后面换Body开始的头,如Filter节点的 ROOT.XML.AA.a表示XML文件<AA><a>...</a></AA>

能改变消息内容的一般为OutputRoot等,后面都一样。如果输出消息格式要变更一下,如TDS的想输出XML,设置MessageFormat='XML',如果要输出CWF,MessageFormat='CWF'......等等。当然,这些都是与消息集定义有关的,具体参数值是多少,要看消息定义物理格式的的名称。

 

全局环境逻辑树:Environment

全局变量在任何一点改变都会影响后面流经的到其它节点的值。

操作它的值如下:Environment.Variables.aaaa='aaaa'

 

局部变量逻辑树:LocalEnvironment

它有变量节点,也有固定的路由节点Destination。关于本节点的操作要仔细阅读并使用,路由中常用到它。

 

错误列表:ExceptionList

主要是出错相关的处理。

 

 

其实学习这些树,就是为了ESQL编程中使用它们,那么,如何引用它们呢?

(可以在资料中查找逻辑树的引用,主要注意Compute常用InputRoot,OutputRoot等,而其它的可能用Root.解析器名称)

======================================================

要丰富引用实例如下面:

Filter



 相应的ESQL

 

 

Filter_ESQL 写道
CREATE FILTER MODULE filter_Filter
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
IF Root.XML.aa.a = 'a' THEN
RETURN TRUE;
ELSEIF Root.XML.aa.a = 'b' THEN
RETURN FALSE;
ELSEIF Root.XML.aa.a = 'u' THEN
RETURN UNKNOWN;
END IF;
END;

END MODULE;
 

 

END MODULE;

 

传入消息

 

 

<aa>
<a>u(a,b,u之一)</a>
<b>b</b>
<c>c</c>
<d>d</d>
</aa>
 

这样消息会分别进入对应的节点。但要注意,Filter节点不能变更消息内容,只能路由一下。它的根是Root,后面的XML是输入消息处设置的解析器名称(消息域与此相同)。这样一个Filter消息流便处理完成。

==============================================================

针对验证,处理方式是验证match,那么输出到相应的Match点,如果不合格,直接输出到Failure点。集体处理方式见下图:



 
这儿只要做相应的属性设置便可,没有编程处理。

 

=================================================

还有另外一类逻辑判断节点:

如果想用Label和RouteToLabel一起达到第一个效果,当然也是可以做到的。

 


特别要注意的一点:因为本compute节点要用到Environment和消息,所以,Compute中的计算方式(Compute Mode)一定要选[LocalEnvironment和消息 ]或者[全部] 才可以。

 

 

ESQL 写道
SET OutputRoot = InputRoot;
IF OutputRoot.XML.aa.a = 'a' THEN
SET OutputLocalEnvironment.Destination.RouterList.DestinationData.labelName ='a';
ELSEIF OutputRoot.XML.aa.a = 'b' THEN
SET OutputLocalEnvironment.Destination.RouterList.DestinationData.labelName ='b';
ELSEIF OutputRoot.XML.aa.a = 'u' THEN
SET OutputLocalEnvironment.Destination.RouterList.DestinationData.labelName ='u';
ELSE
SET OutputLocalEnvironment.Destination.RouterList.DestinationData.labelName ='e';
END IF;

 

如果一个消息有多个匹配 写道
SET OutputRoot = InputRoot;
IF OutputRoot.XML.aa.a = 'a' THEN
SET OutputLocalEnvironment.Destination.RouterList.DestinationData.labelName ='a';
ELSEIF OutputRoot.XML.aa.a = 'b' THEN
SET OutputLocalEnvironment.Destination.RouterList.DestinationData.labelName ='b';
ELSEIF OutputRoot.XML.aa.a = 'u' THEN
SET OutputLocalEnvironment.Destination.RouterList.DestinationData.labelName ='u';
ELSE
SET OutputLocalEnvironment.Destination.RouterList.DestinationData.labelName ='e';
SET OutputLocalEnvironment.Destination.RouterList.DestinationData.labelName ='u';
END IF;

如果消息到了ELSE这儿,像这种情况,消息要选择进入e还是u ,这就要根据消息流中RouteToLabel设置的属性选定[路由到第一个,路由到最后一个],如果选的是第一个,那么消息会进入e,如果选的是路由到最后一个,消息会路由到u。

 

当然,有时候消息会到达多个目的地,这就要求消息一个个的试要到达的目的地,怎么让节点重新载入相应的消息呢?用PROPAGATE:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值