深入biztalk消息引用和引用计数

原创 2007年09月28日 13:43:00

一.   消息引用概述

Biztalk完全基于消息和消息订阅的机制,由发布服务器发布消息,消息代理根据订阅服务器的订阅条件判断发布的消息是否跟某个或某几个订阅匹配到,如果有匹配到消息代理机会把消息路由到所有的订阅了此消息的服务实例。如果没有匹配到就会抛出一个异常,告知这个消息没有订阅者订阅,无法路由。

可以看出消息跟订阅消息的服务实例是成对出现的,姑且称之为服务实例消息对。一条消息如果只有一个订阅者,那这个消息跟这个订阅的服务实例就是一对。如果一条消息有多个订阅者订阅,那么这个消息要同时发送给所有的订阅者,就会出现多对服务实例消息对。

同一个消息在biztalkmessagebox数据库中只保存一个副本,多个服务实例订阅同一消息时,各个实例跟这个消息之间是引用关系,不会各自创立一个消息副本。

消息保存在messagebox数据库的spool表和parts表中。SPOOL 表的内容是消息的总体性描述和消息的上下文属性,一条消息在此表中为一条记录。PARTS 表存放多部分消息的各个部分,一个部分在此表中占一条记录。哪一个是正文部分由spool表中的uidBodyPartID标识。

消息进入到biztalk系统后,路由到某个服务实例,就跟这个服务实例有了引用关系,在这个服务实例运行期间消息不能从数据库中删除。一旦这个服务实例运行完毕,这个消息也就不再使用,可以删除。如果有多个实例同时引用这个消息,则必须引用此消息的实例都完成后才能删除消息。

为了反应消息跟实例之间的引用关系,判断一个消息是否还在被某个实例引用,biztalk有着一套消息引用计数功能。

Biztalk采用消息引用计数表来记录消息的引用数,分为两种情况:如果消息只被一个订阅服务订阅,采用本地引用计数机制,如果消息被多个订阅服务订阅,采用全局引用计数机制,下面分别分析这两种情况下的消息引用计数功能的实现。

二.   本地引用计数

如果消息只有一个服务订阅,消息代理调用bts_FindSubscriptions存储过程时发现一个订阅,这个存储过程返回一条记录。

这种情况下,消息代理会在本地引用计数表BizTalkServerApplication _MessageRefCountLog中记入实例对消息的引用计数。

BizTalkServerApplication_MessageRefCountLog表有三个字段:

uidInstanceID ―― 服务实例的guid

uidMessageID ―― 消息的guid

nRefCount ―― 引用计数(值为1,表示引用了1次)

 

一旦服务实例运行完成,执行如下两个动作:

l         BizTalkServerApplication_MessageRefCountLog相关记录删除

l         将此消息的guid写入MessageZeroSum表中,MessageZeroSum表中保存不再被引用的消息的guid,表示这些消息没有服务实例引用了,可以删除。MessageBox_Message_Cleanup_BizTalkMsgBoxDb作业最终就是根据这个表来清理无用的消息。

三.   全局引用计数

如果消息有多个服务订阅,消息代理调用bts_FindSubscriptions存储过程时发现多个订阅,这个存储过程返回N条记录。

这种情况下,消息代理会把消息引用计数记入到全局消息引用计数表MessageRefCountLog1或者MessageRefCountLog2中,这两个表结构一样,只是一个表是活动的表,另一个作为备用表。至于当时哪个表处于活动状态有ActiveRefCountLog活动引用计数表的相关字段指示。

MessageRefCountLog表的结构:

uidMessageID ―― 消息guid

uidInstanceID ―― 服务实例guid

snRefCount ―― 引用计数。此字段可以为正负,正表示被引用,负表示被放弃引用。

 

   ActiveRefCountLog表的结构:
   fType ―― 1 表示消息引用表
   tnActiveTable ―― 哪个引用计数表为活动,可能的值为12。=1表示MessageRefCountLog1当前为活动表;=2 表示MessageRefCountLog2当前为活动表。 

N个服务订阅了同一个消息,消息代理记入一条引用记录:uidMessageID为这条消息的guiduidInstanceID为空,因为有多个服务订阅;snRefCount设为N,表示这个消息被引用N次。

每个服务各自运行,一个服务完成后就会在此表中增加一条记录:uidMessageID为这条消息的guiduidInstanceID为空;snRefCount设为-1,表示减少一次引用。如果所有服务都完成后,将会增加N条引用计数为-1的记录,正好跟正的N计数对消。

四.   总结

Biztalk中消息如果不特别的进行清理的话,将会一直堆积下去,不管这个消息是否已经不再有用。所以一般需要定期对messagebox数据库中的消息进行清理,把一些过期的无用的消息清理掉,以防大量无用的消息占用很多硬盘空间,也给系统的性能带来负面影响。

Biztalk对消息的引用有完整的记录,可以从这些记录中获知哪些消息已经不再使用,系统可以根据这些信息来清理消息。

关于清理消息biztalk本身提供了几个相关的作业。MessageBox_Message_ManageRefCountLog_BizTalkMsgBoxDbMessageBox_Message_Cleanup_BizTalkMsgBoxD,它们就是根据这些引用计数的统计来完成清理消息工作的。关于这两个作业另外写文章介绍。

  

python引用计数和gc垃圾回收

一,引用计数和垃圾回收介绍: python采用"引用计数"和"垃圾回收"两种机制来管理内存。 引用计数通过记录对象被引用的次数来管理对象。 对对象的引用都会使得引用计数加1,移除对对象的引用,引用计数...
  • u010138758
  • u010138758
  • 2017年03月05日 13:46
  • 1197

【知识点】垃圾回收之引用计数之循环引用

原文地址关于引用计数法,我们可以先看一段wiki上的描述:As a collection algorithm, reference counting tracks, for each object, ...
  • jiasike
  • jiasike
  • 2016年05月09日 20:07
  • 3163

c++11-智能指针和引用计数

一、本节内容 本节内容包括: 对标准库的扩充: 智能指针和引用计数 RAII 与引用计数std::shared_ptrstd::unique_ptrstd::weak_ptr ...
  • icandoit2010
  • icandoit2010
  • 2017年02月23日 10:20
  • 379

java垃圾回收算法之-引用计数器

引用计数器算法算是一种古老的java垃圾回收算法,目前很多版本的java已经废弃掉这种算法了。不过多了解历史解决方案也是很有好处的,通过总结它的优缺点,再与新算法比较,可以帮助更好的理解新算法。 ...
  • linsongbin1
  • linsongbin1
  • 2016年05月23日 13:55
  • 2126

cocos2d-x中的引用计数原理

本文基于3.2版本,适用于3.0及其以上版本,2.X版本可能是使用不同的方式进行处理,本文未对比2.X版本的源代码。首先看一下cocos2d-x中对象的继承体系:                  ...
  • realxie
  • realxie
  • 2016年04月03日 22:30
  • 1637

基于引用计数的智能指针为什么会发生循环引用

下面我说的智能指针都是基于引用计数的智能指针。         首先先明确一个结论:智能指针管理的对象,只有在引用计数为0的时候才会释放。    循环引用发生的情况就是违反了上面所说...
  • jiaoyongqing134
  • jiaoyongqing134
  • 2016年08月12日 14:24
  • 456

Cocos2dx中的引用计数和自动回收池

本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=126 一、引用数 引用计数是c/c++工程中一种古老的内存管理方式。Ios SDK在NSAuto...
  • qinning199
  • qinning199
  • 2013年10月19日 00:44
  • 4696

C++引用计数(reference counting)技术简介(2)

1.一个引用计数(Reference-Counting)基类Reference-counting可用于字符串以外的场合,任何class如果其不同的对象可能拥有相同的值,都适用此技术。但是如果重写cla...
  • K346K346
  • K346K346
  • 2016年02月02日 16:21
  • 1844

GC的引用计数

问题:垃圾回收机制中,引用计数法是如何维护所有对象引用的? 作者:RednaxelaFX 链接:https://www.zhihu.com/question/21539353/answer/1...
  • cds9527
  • cds9527
  • 2017年01月05日 10:26
  • 346

《Objective-C高级编程:引用计数和strong ,weak

作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/17694129 转载请注明出处 如果觉得文章对你有所帮...
  • u012588310
  • u012588310
  • 2014年09月11日 17:57
  • 1345
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入biztalk消息引用和引用计数
举报原因:
原因补充:

(最多只允许输入30个字)