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
?
?
?
这儿只要做相应的属性设置便可,没有编程处理。
?
=================================================
还有另外一类逻辑判断节点:
如果想用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:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?