Vbs save biztalk messages trough wmi

From wiki.perl.lt
Jump to: navigation, search

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
Personal tools
Categories