none
如何从BiztalkDb中取出一个应用的所有相关的挂起的消息正文 RRS feed

  • 问题

  • 求教!

    Biztalk 里面有很多挂起的消息,分属于不同的应用程序,为了补偿数据,需要取出某应用下的所有的挂起的实例,尝试直接从Db中读出消息正文,没有成功。

    后借助于BizTalkOperations.GetMessage(messageID, instanceID)可以得到消息。

    messageID和InstanceID,是从InstancesSuspended ,BizTalkServerApplicationQ_Suspended 两个表取得的

     

    现在问题是1,无法确定Message是哪个应用的

                     2,挂起实例有多个消息部分时,只能取到第一个消息,有时候第一个消息会是错误的描述,这样,就取不到我需要的消息正文内容了

         

    2008年8月28日 2:04

答案

  •  

    先回答第一个问题,关于挂起的消息属于哪个应用的问题,第二个问题需要做些测试,然后回复。

     

    消息在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 基本上就是指HTTPSOAP这类需要外部IIS这类进程接收消息的Request-Response双向接收端口

     

    比较常用的就是xlang/s 和 Message InProcess,以这两个为例。

    1. 如果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所属的应用。
    2. 如果InstancesSuspended表里的uidClassID 是59f295b0-3123-416e-966b-a2c6d65ff8e6,表示挂起的服务是发送端口。
      此时将uidServiceID 字段对应到BizTalkMgmtDb管理数据库bts_SendPort发送端口表的uidGUID,这就找到了这个发送端口在数据库中的记录。bts_SendPort表有字段nApplicationID字段,跟前面一样,根据nApplicationID字段可以在
      bts_application表找到所属的应用。
    2008年8月28日 6:32
  •  

    并不是所有的挂起的实例都在BizTalkServerApplicationQ_Suspended表里,只要在一个消息路由到某个服务,而这个服务又被停止了,这样的被挂起的消息才会存在在BizTalkServerApplicationQ_Suspended表里。一旦消息已经被路由到某个服务,这个服务已经开始处理这个消息后,在这个服务内出错导致挂起,这时只能在InstancesSuspended 表找到挂起的消息。

    而InstancesSuspended表没有相应的消息的id,这时挂起的服务实例跟相应消息的对应关系在InstanceStateMessageReferences_BizTalkServerApplication表里体现:

    uidInstanceID  -- 服务实例guid

    uidMessageID -- 消息guid
    2008年8月29日 3:20

全部回复

  •  

    先回答第一个问题,关于挂起的消息属于哪个应用的问题,第二个问题需要做些测试,然后回复。

     

    消息在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 基本上就是指HTTPSOAP这类需要外部IIS这类进程接收消息的Request-Response双向接收端口

     

    比较常用的就是xlang/s 和 Message InProcess,以这两个为例。

    1. 如果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所属的应用。
    2. 如果InstancesSuspended表里的uidClassID 是59f295b0-3123-416e-966b-a2c6d65ff8e6,表示挂起的服务是发送端口。
      此时将uidServiceID 字段对应到BizTalkMgmtDb管理数据库bts_SendPort发送端口表的uidGUID,这就找到了这个发送端口在数据库中的记录。bts_SendPort表有字段nApplicationID字段,跟前面一样,根据nApplicationID字段可以在
      bts_application表找到所属的应用。
    2008年8月28日 6:32
  •  

    第二个问题

    biztalk在遇到有些错误的时候,biztalk系统本身会产生一些错误消息仅作为显示错误的用途,本不是实际的流转中的消息,检查一下你说的没有正文的消息是不是这类错误消息。

    2008年8月28日 16:06
  •  

    谢谢

     

    第一个问题,已经用您的方法和module,和serviceis 表里的信息解决。

    第二个问题,先说一下我取消息的方法,首先去InstancesSuspended 表里得到挂起的instanceID,,然后去BizTalkServerApplicationQ_Suspended 表里得到和这个instanceID相关的MessageID,然后再用GetMessage()得到消息。我的意思是,当Biztalk把自身的信息添加到挂起的实例里,产生一个MessageID,这样,这个实例里就有两个MessageID,一个是Biztalk自身产生的,另一个是我本来消息的MessageID,但是,在BizTalkServerApplicationQ_Suspended 表里和InstanceID相关的MessageID,会只有Biztalk产生的MessageID,,本来的消息的MessageID,在这个表里不存在了,由此,我用这个表里的MessageID,和InatanceID去取消息,会漏掉一部分消息。

    2008年8月29日 2:52
  •  

    并不是所有的挂起的实例都在BizTalkServerApplicationQ_Suspended表里,只要在一个消息路由到某个服务,而这个服务又被停止了,这样的被挂起的消息才会存在在BizTalkServerApplicationQ_Suspended表里。一旦消息已经被路由到某个服务,这个服务已经开始处理这个消息后,在这个服务内出错导致挂起,这时只能在InstancesSuspended 表找到挂起的消息。

    而InstancesSuspended表没有相应的消息的id,这时挂起的服务实例跟相应消息的对应关系在InstanceStateMessageReferences_BizTalkServerApplication表里体现:

    uidInstanceID  -- 服务实例guid

    uidMessageID -- 消息guid
    2008年8月29日 3:20
  • 时挂起的服务实例跟相应消息的对应关系在InstanceStateMessageReferences_BizTalkServerApplication表里体现

    就是想找这个表,谢谢

    我先试下!

    2008年8月29日 10:04