BizTalk环境中不修改应用,如何获取挂起消息的ReceivedFileName?
获取BizTalk挂起消息的ReceivedFileName属性
方法一:查询SQL数据库
BizTalk的消息上下文属性存储在默认名称为BizTalkMsgBoxDb的消息箱数据库中,无需改动应用即可直接查询。
操作步骤:
- 先查询
ReceivedFileName属性对应的PropertyId:
SELECT PropertyId, Name, Namespace FROM BizTalkMsgBoxDb.dbo.PropertySchema WHERE Name = 'ReceivedFileName' AND Namespace = 'http://schemas.microsoft.com/BizTalk/2003/file-properties'
- 用获取到的PropertyId关联查询挂起消息的属性值:
SELECT i.ServiceInstanceId, m.MessageId, cp.Value AS ReceivedFileName FROM BizTalkMsgBoxDb.dbo.Instances i JOIN BizTalkMsgBoxDb.dbo.Messages m ON i.InstanceId = m.InstanceId JOIN BizTalkMsgBoxDb.dbo.MessageContextProperties cp ON m.MessageId = cp.MessageId WHERE i.SuspendStatus = 1 -- 1代表消息处于挂起状态 AND cp.PropertyId = '替换为第一步查询到的PropertyId'
方法二:使用PowerShell脚本
借助BizTalk的WMI接口或管理对象模型,无需修改应用即可提取挂起消息的上下文属性。
示例脚本:
# 加载BizTalk管理组件 [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.BizTalk.ExplorerOM") # 配置BizTalk服务器信息 $bizTalkServer = "你的BizTalk服务器名称" # 获取所有挂起的服务实例 $suspendedInstances = Get-WmiObject -ComputerName $bizTalkServer -Namespace root/MicrosoftBizTalkServer -Query "SELECT * FROM MSBTS_ServiceInstance WHERE ServiceInstanceStatus=4" foreach ($instance in $suspendedInstances) { # 获取实例关联的消息 $messages = Get-WmiObject -ComputerName $bizTalkServer -Namespace root/MicrosoftBizTalkServer -Query "SELECT * FROM MSBTS_MessageInstance WHERE ServiceInstanceId='$($instance.ServiceInstanceId)'" foreach ($msg in $messages) { # 查询ReceivedFileName属性值 $props = Get-WmiObject -ComputerName $bizTalkServer -Namespace root/MicrosoftBizTalkServer -Query "SELECT * FROM MSBTS_MessageContextProperty WHERE MessageInstanceId='$($msg.MessageInstanceId)' AND Name='ReceivedFileName' AND Namespace='http://schemas.microsoft.com/BizTalk/2003/file-properties'" if ($props) { Write-Host "实例ID: $($instance.ServiceInstanceId) | 消息ID: $($msg.MessageInstanceId) | ReceivedFileName: $($props.Value)" } } }
注意:运行脚本的账号需具备BizTalk管理数据库和消息箱数据库的读取权限。
内容的提问来源于stack exchange,提问作者iamramanavenkat
相关产品推荐
相关产品推荐

