积极答复者
如何从BiztalkDb中取出一个应用的所有相关的挂起的消息正文

问题
-
求教!
Biztalk 里面有很多挂起的消息,分属于不同的应用程序,为了补偿数据,需要取出某应用下的所有的挂起的实例,尝试直接从Db中读出消息正文,没有成功。
后借助于BizTalkOperations.GetMessage(messageID, instanceID)可以得到消息。
messageID和InstanceID,是从InstancesSuspended ,BizTalkServerApplicationQ_Suspended 两个表取得的
现在问题是1,无法确定Message是哪个应用的
2,挂起实例有多个消息部分时,只能取到第一个消息,有时候第一个消息会是错误的描述,这样,就取不到我需要的消息正文内容了
答案
-
先回答第一个问题,关于挂起的消息属于哪个应用的问题,第二个问题需要做些测试,然后回复。
消息在biztalk不会孤立的存在,必然是和某个服务实例关联在一起,一个消息至少需要有一个或者多个服务实例对其进行处理。
方法BizTalkOperations.GetMessage(messageID, instanceID)
其中的instanceID表示正在处理这个消息的服务实例,messageID表示这个消息。
可以通过instanceID在InstancesSuspended表中找到这个服务实例的记录,在InstancesSuspended表中一个挂起的的服务实例表现为一条记录。InstancesSuspended表里用两个字段:
uidServiceID -- 表示这个服务实例的服务Guid,比如挂起的服务实例是一个orchestration的话,就是这个orchestration的id。
uidClassID -- 表示这个服务所属的类别。
biztalk中所有的服务类别都在BizTalkMgmtDb管理数据库中的adm_ServiceClass表中列处理,一共四类:
名称 Guid 描述 XLANG/s 226fc6b9-0416-47a4-a8e8-4721f1db1a1b 业务流程orchestration Messaging InProcess 59f295b0-3123-416e-966b-a2c6d65ff8e6 表示一般的发送端口、Solicit- Response发送端口 MSMQT 3d7a3f58-4bfb-4593-b99e-c2a5dc35a3b2 MS消息队列 Messaging Isolated 683aedf1-027d-4006-ae9a-443d1a5746fc 基本上就是指HTTP和SOAP这类需要外部IIS这类进程接收消息的Request-Response双向接收端口 比较常用的就是xlang/s 和 Message InProcess,以这两个为例。
-
如果InstancesSuspended表里的uidClassID 是226fc6b9-0416-47a4-a8e8-4721f1db1a1b,表示挂起的服务是orchestration。
此时将uidServiceID 字段对应到BizTalkMgmtDb管理数据库bts_Orchestration表的uidGUID字段。就能找到挂起的orchestration在数据库中的记录。
bts_Orchestration表中有nAssemblyID字段,表示这个orchestration所属的Assembly。
nAssemblyID字段再跟bts_assembly表的nID字段关联,bts_assembly表中的nApplicationID字段,表示这个Assembly属于哪个应用。
nApplicationID字段再对应到bts_application表的nID字段,最后就找到了这个挂起的orchestration所属的应用。 -
如果InstancesSuspended表里的uidClassID 是59f295b0-3123-416e-966b-a2c6d65ff8e6,表示挂起的服务是发送端口。
此时将uidServiceID 字段对应到BizTalkMgmtDb管理数据库bts_SendPort发送端口表的uidGUID,这就找到了这个发送端口在数据库中的记录。bts_SendPort表有字段nApplicationID字段,跟前面一样,根据nApplicationID字段可以在bts_application表找到所属的应用。
-
-
并不是所有的挂起的实例都在BizTalkServerApplicationQ_Suspended表里,只要在一个消息路由到某个服务,而这个服务又被停止了,这样的被挂起的消息才会存在在BizTalkServerApplicationQ_Suspended表里。一旦消息已经被路由到某个服务,这个服务已经开始处理这个消息后,在这个服务内出错导致挂起,这时只能在InstancesSuspended 表找到挂起的消息。
而InstancesSuspended表没有相应的消息的id,这时挂起的服务实例跟相应消息的对应关系在InstanceStateMessageReferences_BizTalkServerApplication表里体现:
uidInstanceID -- 服务实例guid
uidMessageID -- 消息guid
全部回复
-
先回答第一个问题,关于挂起的消息属于哪个应用的问题,第二个问题需要做些测试,然后回复。
消息在biztalk不会孤立的存在,必然是和某个服务实例关联在一起,一个消息至少需要有一个或者多个服务实例对其进行处理。
方法BizTalkOperations.GetMessage(messageID, instanceID)
其中的instanceID表示正在处理这个消息的服务实例,messageID表示这个消息。
可以通过instanceID在InstancesSuspended表中找到这个服务实例的记录,在InstancesSuspended表中一个挂起的的服务实例表现为一条记录。InstancesSuspended表里用两个字段:
uidServiceID -- 表示这个服务实例的服务Guid,比如挂起的服务实例是一个orchestration的话,就是这个orchestration的id。
uidClassID -- 表示这个服务所属的类别。
biztalk中所有的服务类别都在BizTalkMgmtDb管理数据库中的adm_ServiceClass表中列处理,一共四类:
名称 Guid 描述 XLANG/s 226fc6b9-0416-47a4-a8e8-4721f1db1a1b 业务流程orchestration Messaging InProcess 59f295b0-3123-416e-966b-a2c6d65ff8e6 表示一般的发送端口、Solicit- Response发送端口 MSMQT 3d7a3f58-4bfb-4593-b99e-c2a5dc35a3b2 MS消息队列 Messaging Isolated 683aedf1-027d-4006-ae9a-443d1a5746fc 基本上就是指HTTP和SOAP这类需要外部IIS这类进程接收消息的Request-Response双向接收端口 比较常用的就是xlang/s 和 Message InProcess,以这两个为例。
-
如果InstancesSuspended表里的uidClassID 是226fc6b9-0416-47a4-a8e8-4721f1db1a1b,表示挂起的服务是orchestration。
此时将uidServiceID 字段对应到BizTalkMgmtDb管理数据库bts_Orchestration表的uidGUID字段。就能找到挂起的orchestration在数据库中的记录。
bts_Orchestration表中有nAssemblyID字段,表示这个orchestration所属的Assembly。
nAssemblyID字段再跟bts_assembly表的nID字段关联,bts_assembly表中的nApplicationID字段,表示这个Assembly属于哪个应用。
nApplicationID字段再对应到bts_application表的nID字段,最后就找到了这个挂起的orchestration所属的应用。 -
如果InstancesSuspended表里的uidClassID 是59f295b0-3123-416e-966b-a2c6d65ff8e6,表示挂起的服务是发送端口。
此时将uidServiceID 字段对应到BizTalkMgmtDb管理数据库bts_SendPort发送端口表的uidGUID,这就找到了这个发送端口在数据库中的记录。bts_SendPort表有字段nApplicationID字段,跟前面一样,根据nApplicationID字段可以在bts_application表找到所属的应用。
-
-
谢谢
第一个问题,已经用您的方法和module,和serviceis 表里的信息解决。
第二个问题,先说一下我取消息的方法,首先去InstancesSuspended 表里得到挂起的instanceID,,然后去BizTalkServerApplicationQ_Suspended 表里得到和这个instanceID相关的MessageID,然后再用GetMessage()得到消息。我的意思是,当Biztalk把自身的信息添加到挂起的实例里,产生一个MessageID,这样,这个实例里就有两个MessageID,一个是Biztalk自身产生的,另一个是我本来消息的MessageID,但是,在BizTalkServerApplicationQ_Suspended 表里和InstanceID相关的MessageID,会只有Biztalk产生的MessageID,,本来的消息的MessageID,在这个表里不存在了,由此,我用这个表里的MessageID,和InatanceID去取消息,会漏掉一部分消息。
-
并不是所有的挂起的实例都在BizTalkServerApplicationQ_Suspended表里,只要在一个消息路由到某个服务,而这个服务又被停止了,这样的被挂起的消息才会存在在BizTalkServerApplicationQ_Suspended表里。一旦消息已经被路由到某个服务,这个服务已经开始处理这个消息后,在这个服务内出错导致挂起,这时只能在InstancesSuspended 表找到挂起的消息。
而InstancesSuspended表没有相应的消息的id,这时挂起的服务实例跟相应消息的对应关系在InstanceStateMessageReferences_BizTalkServerApplication表里体现:
uidInstanceID -- 服务实例guid
uidMessageID -- 消息guid