首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

MB备忘-三

2012-11-09 
MB备忘----3做完消息集,现在来做消息流。切换到[代理应用开发视图]进行一个最简单的流开发。Queue-----Queue

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


MB备忘-三
?相应的ESQL

?

?


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

?

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

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

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

?


MB备忘-三

特别要注意的一点:因为本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:

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

热点排行