Vbs save biztalk messages trough wmi
Kai reikia nusisiurbti iš BizTalk service instance'ų message'us, paprasčiausia yra pasinaudoti WMI klasėmis, ir taip automatizuoti procesą. Service instance'o būklės nusatomos per //ServiceStatus// property, galimos reikšmės:
Ready to run 1 Active 2 Suspended (resumable) 4 Dehydrated 8 Completed with discarded messages 16 Suspended (not resumable) 32 In breakpoint 64
Taip pat galima nustatyti konkrečias ServiceInstance'ų klases per property //ServiceClass// :
Orchestration 1 Tracking 2 Messaging 4 MSMQT 8 Other 16 Isolated adapter 32 Routing failure report 64
16 tipo instance'ai - tai sisteminiai BizTalk instance'ai, tai greičiausiai su jais nepavyks nieko padaryti (peržiūrėti, išsisaugoti)
On Error Resume Next
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
arrComputers = Array("ServerName")
For Each strComputer In arrComputers
WScript.Echo "ActivationTime;InstanceID;ServiceName;MessageType;MessageInstanceID"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\MicrosoftBizTalkServer")
Set colItems = objWMIService.ExecQuery("SELECT * FROM MSBTS_ServiceInstance " & _
" WHERE HostName = 'BizTalkApplicationHost' " & _
" AND ServiceClass = 1" & _
" AND (ServiceName='OrchestrationName') " & _
" AND ServiceStatus = 8 " _
, "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
Set colMsgs = objWMIService.ExecQuery("SELECT * FROM MSBTS_MessageInstance " & _
" WHERE ServiceInstanceID = '" & objItem.InstanceID & "' " _
, "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objMsg In colMsgs
WScript.Echo WMIDateStringToDate(objItem.ActivationTime) & ";" & objItem.InstanceID & ";" & _
objItem.ServiceName & ";" & objMsg.MessageType & ";" & objMsg.MessageInstanceID
Next
Next
Next
Norint išsaugoti message'ą į failą, naudojam
objMsg.SaveToFile(fPath)
Deja, kad dėl kažkokio WMI/BizTalk bugo, yra nusiurbiamas tik pirmas ServiceInstance'o message'as, kiti randami tik nurodžius konkrečius ID :((
Kitas būdas, norint išsaugoti message'us galimas, jei siurbiam visus message'us, ir paskui juos grupuojam pagal InstanceId, sukurdami katalogą tokiu pavadinimu, koks ID. Dar priedo prikabinam numerį, nurodydami koks InstanceId state'as. Prieš paleidžiant reikia sukurti katalogus atitinkamiems orkestracijų tipams
On Error Resume Next
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
arrComputers = Array("ServerName")
For Each strComputer In arrComputers
WScript.Echo "ActivationTime;InstanceID;ServiceName;MessageType;MessageInstanceID;ErrorMessage"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\MicrosoftBizTalkServer")
Set colItems = objWMIService.ExecQuery("SELECT * FROM MSBTS_MessageInstance " & _
" WHERE HostName = 'BizTalkServerApplication' " & _
" AND ServiceClass = 1" & _
" AND (ServiceName='OrchestrationName1' OR ServiceName='OrchestrationName2') " _
, "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)
WScript.Echo "Query executed successfully"
For Each objItem In colItems
Err.Clear
ErrorMsg = ""
Set oFS = CreateObject("Scripting.FileSystemObject")
If objItem.ServiceName="orchServiceOrdering" Then
fPath = "d:\scripts\Orchestration1\" & objItem.ServiceInstanceID & "_" & objItem.ServiceInstanceStatus
ElseIf objItem.ServiceName="orchOrderStatusProcess" Then
fPath = "d:\scripts\Orchestration2\" & objItem.ServiceInstanceID & "_" & objItem.ServiceInstanceStatus
End If
If Not oFS.FolderExists(fPath) Then
oFS.CreateFolder(fPath)
End IF
objItem.SaveToFile(fPath)
If Err.Number <> 0 Then
ErrorMsg = "Error occured on SaveToFile: " & Err.Description
Err.Clear
End If
WScript.Echo WMIDateStringToDate(objItem.CreationTime) & ";" & objItem.ServiceInstanceID & ";" & objItem.ServiceName & _
";" & objItem.MessageType & ";" & objItem.MessageInstanceID & ";" & ErrorMsg
Next
Next