MB备忘-三
做完消息集,现在来做消息流。
切换到[代理应用开发视图]进行一个最简单的流开发。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
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和消息 ]或者[全部] 才可以。
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;
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: