2008年12月25日星期四

Tibco Designer Mapping - Attribute 的默认值

在定义schema时我们可以为元素的attribute定义一个默认值,事实上Tibco有可能不会帮我们自动填充。借用我的另一篇文章的mapping ,这里我们的目的是把红箱的内容mapping到蓝箱去,我们定义了蓝箱schema(目标schema)中BlueCotainer元素的desc属性默认是40ft.

这个mapping是如此简单我们会很自然采用了如下的process, mapping是在end这个Activit 中完成。但结果没有像我们预期的那样当红箱不提供desc的时候蓝箱自动补上40ft这个值。


我们试了一下引入Mapper,mapping在Mapper中完成后copy到end中,如下图:


这下终于可以了。对比了一下两个不同process的XSLT, 关于mapping的部分并没有什么不同,只能归结于BW引擎对待二者的工作机制稍有不同。所以如果想尽可能发挥schema的功能引入mapper是不错的选择,尽管很多时候多此一举。




Tibco Designer Mapping - Empty Node

在BW中除了按照要求进行符合schema的mapping外,更高的要求是不要产生空节点,即如果input数据元素没有的话结果也不应产生。按照下图的map法,即使没有RedContainer,一个空的BlueContianer节点会出现在结果里。好友鸡尾虾提醒说这并不是Tibco的错,原因在于xpath只是帮我们在节点中导航而并作额外判断(虽然mapping的界面看来如此)。







正确的做法是先多RedContianer进行循环,对于schema结构相差较大的mapping必须采用更多的判断来防止这种无意义的空节点。




2008年12月10日星期三

Tibco Designer Mapping - Looping

设计BW流程我们要经常涉及mutiple节点到mutiple节点的mapping, 往往一不小心就会得出错误结果。例如我们要从origin.xsd的数据mapping到dest.xsd中:








这里的两个schema大同小异,不同部分用红色箭头标出并且我们有如下输入数据:








如果使用下图这样的mapping方法,注意在集装箱这个元素上我们没用任何操作:





得出的结果会是是原来两个红色集装箱的货物都装到一个蓝色集装箱里了。











我们接下来是一下把集装箱的信息也关联起来:
可以得出结论是原来两个红色集装箱的货物都一一搬过两个蓝色集装箱中了。到底采用哪种mapping就要看我们的实际业务需要了,不过不小心还是会得出错误结果。

2008年12月9日星期二

Acknowledge Mode in Tibco BusinessWork

BW经常要侦听queue,接收到信息后启动process进行处理。有两种mode是BW比较常用并且容易出现问题的: TIBCO EMS Explicit Client Acknowledge 和Client。其中前者是使用Tibco EMS才可以使用的,为方便我们简称为Tibco, 两种方式都需要在随后的Process流程中使用Confirm Activity才能把信息从信息从队列中清除。

使用Tibco这种方式如果由于某种原因没有Confirm, 所有同一session中delive的信息都会重新delive。比如队列中有5条信息并且编号分别为1,2,3,4,5,Tibco会启动5个实例分别来处理这5个信息。假如1首先完成但没有confirm(例如异常没有被捕捉或bug),这时这5条信息会被重新delive并且5个新的实例会被启动,加上原来的4个,就共有9(5+4)个实例在运行了!

如果使用Client这种Acknowledge mode, 要在designer里填入max session(比如输入10)的值,个人觉得这应该是运行时所允许的最大实例数目。同样上述的情况下,只有没有被confirm的信息会被重新delive,也就是说会有5(1+4)个实例在运行。在这种模式下你会发现有10个侦听器会在队列上面。

总而言之无论何种情况,包括发生任何异常porcess都应该能够捕捉并处理,使得confirm能够把信息从队列中清除。更重要的是对于Tibco Acknowledge这种模式你可以在发布应用时指定或不指定最大实例数,垃圾信息驻留在队列中也是bug.

2008年12月8日星期一

Tibco EMS routing 设置之二

2)authorization=enabled ,注意这仍然是BLADE的设置,这表明这是其他EMS(例如VAMPIRE)作为客户登陆入BLADE需要用户名和密码。要启动该选项,输入命令:

set server autohorization=enabled

改变该设置并不需要重启服务。此时我们可以发现信息都pending在VAMPIRE这台EMS中。我们要在BLADE建立用户帐号如下:

create user VAMPIRE password=12345

这里一定要注意VAMPIRE是帐号,一定要是要登录进来的服务名。最后一步是设置VAMPIRE这台EMS,EMS会用自己的服务名来登录,关键就是设置密码:

set server password=12345

VAMPIRE会用这个密码登入BLADE,我们可以发现信息又可以routing到BLADE。