नमस्कार

हिंदी भाषा के इस लेख में आपका स्वागत है, आपके प्रतिक्रिया का हमें इंतेज़ार रहेगा और हम आशा करते है की यह लेख आपके लिए उपयोगी साबित होगी।



परिचय

यदि आप कभी 2 क्यों एक सिस्टम बंद है बाहर आंकड़ा करने के लिए आप पूछ रहा हूँ एक फोन मिल गया है, आप आत्म चिकित्सा प्रणालियों की उपयोगिता की सराहना करेंगे। WMI के साथ थोड़ा काम के साथ हम BizTalk करने के लिए इस अवधारणा लागू कर सकते हैं।

इस लेख को शामिल कैसे BizTalk होस्ट आवृत्तियों के लिए ऐसा करने के लिए, लेकिन स्थान प्राप्त करने और भेजने पोर्ट के लिए समान तकनीकों लागू किया जा सकता।

क्यों होस्ट आवृत्तियों पहली जगह में जाना? SQL सर्वर, और यह ऊपर BizTalk बैठता बहुत चिपकू है: यह भी एक बहुत ही संक्षिप्त अंतराल के लिए कनेक्टिविटी खो देता है, तो होस्ट आवृत्तियों शट डाउन जाएगा। कभी-कभी आने के लिए एक रिबूट होस्ट इंस्टेंसेस विफल करने के बाद।यहां तक कि कोई व्यवधान है जो SQL, जैसे जा रहा ऑफ़लाइन, एंटरप्राइज़ एकल साइन-ऑन सेवा के सभी शामिल नहीं करता है होस्ट आवृत्तियों नीचे ला सकते हैं।

और अपने वसा उँगलियों सह कार्यकर्ता कम मत समझना। मैं एक बार एक हफ्ते के मूल्य परीक्षण के नीचे नाली जाना है क्योंकि एक सिस्टम व्यवस्थापक पर उसकी गुणवत्ता आश्वासन पर्यावरण CPU, की एक टन अप ले तो उन्होंने इसे अक्षम इस एक सेवा देखा था देखा था। उस सेवा होस्ट उदाहरण था, और भले ही वह एक BizTalk व्यवस्थापक नहीं था तो वह आवृत्ति को रोकने में सक्षम था।

कुंजी गुर काम यहाँ पर सभी WMI के माध्यम से कर रहे हैं। पूरी स्क्रिप्ट आलेख के अंत में है, लेकिन चलो मज़ा के माध्यम से चलना भागों। सभी स्क्रिप्ट यहाँ अच्छे ' राजभाषा ढंग vbScript है, लेकिन यह PowerShell, एक .NET कंसोल प्रोग्राम, या कुछ और कि आप देता है के माध्यम से ही काम करता है WMI तक पहुँचने।

क्या हम विकसित करने के लिए जा रहे हैं एक स्क्रिप्ट जो Windows में एक शेड्यूल्ड कार्य के रूप में चला सकते हैं है। जब यह चलता है, यह जाएगा हमारे होस्ट आवृत्तियों पर देखो, हैं जो अक्षम हैं सक्षम करें, और यदि यह उदाहरण ऊपर है और चल (Windows अनुप्रयोग लॉग करने के लिए लेखन) और साथ ही नहीं मिल सकता हमें ईमेल। संकुल परिवेशों जहाँ गैर सक्रिय नोड पर होस्ट आवृत्ति प्रारंभ नहीं कर सकता, के लिए, स्क्रिप्ट इस का पता लगाने और उस आवृत्ति को छोड़ जाएगा।

स्क्रिप्ट बार - चलाने के लिए शेड्यूल किया ��ा कर ���कते हैं कहते हैं, हर 10 मिनट - और बीमा है कि हम हमारे प्रक्रियाओं चल रहा रखो।

नमूना बनाना

प्रारंभ करने के लिए, आप BizTalk प्रबंधन डेटाबेस को क्वेरी करने के लिए सक्षम होने के लिए की जरूरत है। WMI हमें इस के लिए एक आसान हुक देता है:

Set objWMIService = GetObject("winmgmts://./root/MicrosoftBizTalkServer")

अब आप में चारों ओर देखो कर सकते हैं प्रबंधन डेटाबेस SQL के साथ - अच्छी तरह से, लोगों को वास्तव में सरल क्वेरीज़ है। क्या होगा और अभ्यस्त काम बाहर खोजने कुछ परीक्षण और त्रुटि की आवश्यकता है। उदाहरण के लिए, हमारे अंतिम स्क्रिप्ट की जाँच करने के लिए होस्ट नामों की एक सूची प्रदान की मदद से आप (सभी होस्ट मशीन - पर के बजाय वहाँ हो सकता है कुछ कहाँ आप चाहते हैं कभी कभी एक होस्ट आवृत्ति ऑफ़लाइन अस्थायी रूप से लेने के लिए)। तुम्हें लगता होगा, तो हम एक विशिष्ट होस्ट नाम के लिए डेटाबेस को क्वेरी होगा।

लेकिन है कि जहाँ खंड क्वेरी पर सिर्फ काम नहीं करता है, तो हम उन सभी को पकड़ो और सूची के माध्यम से पुनरावृति:

Set colHostInstances = objWMIService.ExecQuery("Select * from MSBTS_HostInstance Where HostType=1 And IsDisabled=False ")

कि हमारे होस्ट आवृत्तियों का संग्रह देता है। हमारे स्क्रिप्ट में, हम एक विशेष रूप से एक को खोजने के लिए उस के माध्यम से पुनरावृति।

अगर आप WMI के लिए नए हैं, प्यार में गिर करने के लिए तैयार: आप वस्तुओं है कि तुम सीधा गुण और विधियाँ के माध्यम से हेरफेर के एक अमीर सेट प्राप्त करें। इस स्थिति में, एक बार हम हम में रुचि रखते हैं विशेष मेजबान पाया है, हम की जाँच करें कि क्या यह गुण ServiceState पर देख कर रुक गया है। इसे बंद कर दिया है, लेकिन इतनी कोड पढ़ने के लिए आसान जा रहा है ऊपर समाप्त होता है के रूप में अच्छा है प्रोग्रामिंग अभ्यास हम एक निरंतर इस के लिए परिभाषित मान 1 इंगित करता है:

if Ucase(HostName)=Ucase(objHostInstance.HostName ) And objHostInstance.ServiceState = HostInstServiceState_Stopped then

अगले ऊपर हम हम एक संकुल मेजबान के साथ काम कर रहे हैं, तो यह देखने के लिए चाहते हैं, और यदि ऐसा है, तो हम में सक्रिय नोड पर नहीं देख रहे हैं या आवृत्ति है। यदि आप एक होस्ट आवृत्ति को किसी क्लस्टर में एक गैर सक्रिय नोड पर प्रारंभ करने का प्रयास करें, यह विफल हो जाएगा, और यह हमारे स्क्रिप्ट एक झूठी चेतावनी बाहर ईमेल करने के लिए कारण होता है।

हम जाँच करें कि क्या मेजबान के लिए संकुल है और फिर चाहे सक्रिय नोड क्लस्टर सर्वर पर आवृत्ति है है की तुलना करें:

if (objHostInstance.ClusterInstanceType = HostIsClustered) then
  ' is it on the active node?
  strActiveClusterNode=GetActiveClusterNode()
  if (Ucase(objHostInstance.RunningServer) = Ucase(strActiveClusterNode)) then
  iStartThis = 1
  end if
     
 else
  iStartThis=1
 end if
...

और हमारे अंतिम जादू की चाल के लिए, आइए हम वहाँ, GetActiveClusterNode() में popped उस फ़ंक्शन देखें। यह एक छोटे और अधिक WMI जादू पाने सक्रिय क्लस्टर नोड के लिए निष्पादित करता है एक बहुत साधारण vbScript फ़ंक्शन है। हम हम पर चला रहे हैं जो कंप्यूटर का नाम हो रही शुरू:

Set wshShell = WScript.CreateObject( "WScript.Shell" )
 strComputerName = wshShell.ExpandEnvironmentStrings( "%COMPUTERNAME%" )

हम इस भाग की मशीन है क्लस्टर के बारे में जानकारी प्राप्त करने के लिए का उपयोग करें:

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\MSCluster")
 Set colItems = objWMIService.ExecQuery("SELECT * FROM MSCluster_NodeToActiveGroup""WQL", _
                                          wbemFlagReturnImmediately + wbemFlagForwardOnly)

और फिर हम सक्रिय नोड को खोजने के लिए सूची पुनरावृति (थोड़ा ज्ञान कैसे का उपयोग कर क्वेरी से डेटा स्वरूपित किया गया है - यह वास्तव में कुछ है कि बस पर कोड की तलाश से बेहतर समझाया जा सकता है नहीं है)।

नीचे पूरी स्क्रिप्ट है। यह (प्रति पंक्ति एक होस्ट नाम) से पढ़ने के लिए HostInstancesList.txt नाम की कोई फ़ाइल के लिए दिखता है, लेकिन आप इसे एक आदेश-पंक्ति पैरामीटर के रूप में पारित करने के लिए पसंद करेंगे, तो आप WScript.Arguments.Item(0) स्थानापन्न कर सकते हैं।

इसे चलाने के लिए Windows कार्य शेड्यूलर से, कार्य क्रिया सेट करने के लिए: cscript startuphosts.vbs "में स्टार्टअप" फ़ोल्डर स्क्रिप्ट वाले फ़ोल्डर के लिए सेट करने के लिए याद रखें, अन्यथा स्क्रिप्ट नहीं मिलेगा की जाँच करने के लिए होस्ट की एक सूची से युक्त फ़ाइल। आप भी के लिए चर strSMTPServer और ई-मेल सूचनाएँ सक्षम करने के लिए strDestinationAddress मान में डाल करने के लिए की आवश्यकता होगी। चीज़ों के इन प्रकार के लिए, मैं हमेशा एक ईमेल वितरण सूची की स्थापना तो अपने व्यवस्थापक लिपियों के सभी एक ही हार्ड-coded पते का उपयोग कर सकते हैं और आप जो सूचनाएँ हो जाता है, यह प्रबंधित करने के लिए distrib सूची का उपयोग अनुशंसा करते हैं।

----------------------------------------------------------------------------------------------------
 
' StartUpHosts.vbs Start up host instances
' by Ron Phillips
' Original: 8/31/2012
' Revisions:
' Usage: Cscript StartUpHosts.vbs
' Configuration: Looks for file HostInstancesList.txt with one host instance per line
'
'
'
'
Option Explicit
 
CONST ForReading = 1
' Host Instance status number
CONST HostInstServiceState_Stopped = 1
' is the host clustered?
CONST HostIsClustered = 1
' Windows App Log status codes
CONST Log_Code_Error = 1
CONST Log_Code_Success = 0
CONST Log_Code_Warning = 2
CONST Log_Code_Information=4
' This next item is to let the email include a note as to which environment its from,
' so typical values might be "QA" "DEV" "UAT" etc.
CONST What_Environment= "PROD"
 
Dim oFS : Set oFS = CreateObject( "Scripting.FileSystemObject" )
Dim thewholelist
Dim arrReplayList
Dim arrListRow
Dim sRow
Dim strGlobalhost
 
CheckForFile("HostInstancesList.txt")
' read in the list
thewholelist=oFS.OpenTextFile("HostInstancesList.txt",ForReading).ReadAll
arrReplayList=Split(thewholelist,vbCrLf)
' now we're going to do this in an inefficient way - for each record in the list,
' we query the management database and iterate through the whole list
' we could keep the collections around and just query once
' but this is a read-only operation and very low resource impact, so it's not a big deal
for each sRow in arrReplayList
 if len(sRow)>0 then
  strGlobalhost=sRow
  Call HostInstanceStart(sRow)
  ' pause a second between each one
  WScript.Sleep(1000)
 end if
next
 
WScript.Echo("Finished starting up host instances")
 
WScript.Quit 0
 
' Support functions, if yo are adding/modifying please keep these generic/re-usable.
Sub CheckForFile(thefile)
 
   Dim ocheckFS : Set ocheckFS = CreateObject( "Scripting.FileSystemObject" )
 
   If (Not ocheckFs.FileExists(thefile)) Then
      WScript.Echo thefile + " is missing"
      WScript.Quit 1
   End If
 
End Sub
 
Sub HostInstanceStart(HostName)
 Dim objWMIService
 Dim colHostInstances
 Dim objHostInstance
 Dim strActiveClusterNode
 Dim iStartThis
 Dim iFoundName
  
 '   get a WMI object to hook in to the management database
    Set objWMIService = GetObject("winmgmts://./root/MicrosoftBizTalkServer")
  
  
  
 '   query BizTalk host instances that are of type In-Process (within BizTalk Server installation) and enabled
 
    iFoundName=0
    Set colHostInstances = objWMIService.ExecQuery("Select * from MSBTS_HostInstance Where HostType=1 And IsDisabled=False ")
 
  
 '   If any host instance is found check name
    If (colHostInstances.Count > 0) Then
        Wscript.Echo("Checking status of " + HostName)
        For Each objHostInstance in colHostInstances
   ' check the name
   ' To list the host name (space) server name :WScript.Echo("On " + objHostInstance.Name)
   if Ucase(HostName)=Ucase(objHostInstance.HostName ) then
    iFoundName = 1
   end if
   if Ucase(HostName)=Ucase(objHostInstance.HostName ) And objHostInstance.ServiceState = HostInstServiceState_Stopped then
    iStartThis=0
    ' is it clustered?
    if (objHostInstance.ClusterInstanceType  = HostIsClustered) then
     ' is it on the active node?
     strActiveClusterNode=GetActiveClusterNode()
     if (Ucase(objHostInstance.RunningServer) = Ucase(strActiveClusterNode)) then
     iStartThis = 1
     end if
     
    else
     iStartThis=1
    end if
     
    if iStartThis=1 then
     Wscript.Echo " Starting " "" & objHostInstance.Name & """..."
     Call WriteWinAppLog("BizTalk StartUpHosts.vbs script Attempting to start Host Instance " + objHostInstance.Name,Log_Code_Information)
 
     objHostInstance.Start
     CheckWMIError
    end if
     
 
   end if
        Next
  if iFoundName=0 Then
   
          Wscript.Echo "Cannot find sny enabled hosts instance for host " + HostName + ". Check to see if host instance is disabled or name is spelled wrong."
    Call WriteWinAppLog("BizTalk StartupHosts.vbs script error: Unable to find enabled host instance " + HostName,Log_Code_Error)
    Call SendErrMail("Unable to find host instance " + HostName )
 
   
  end if
    Else
        Wscript.Echo "Cannot find sny enabled hosts on this system"
  Call WriteWinAppLog("BizTalk StartupHosts.vbs script error: Unable to find any enabled host instances on this system",Log_Code_Error)
  Call SendErrMail("Unable to find any enabled host instances on this system "  )
 End If
End Sub
 
Function GetActiveClusterNode()
 On Error Resume Next
 Dim strnodename
 Dim strnodename1
 Dim strComputer
 Dim wshShell
 Dim computername
 Dim arrComputers
 Dim objWMIService
 Dim Count, count1
 Dim colItems,objItem
 Dim strcomputername
  
 Set wshShell = WScript.CreateObject( "WScript.Shell" )
 strComputerName = wshShell.ExpandEnvironmentStrings( "%COMPUTERNAME%" )
 
 computername = Trim(strcomputername)
 Count=Len(strcomputername)
 Count1=Len(strcomputername)
 count = count + 1
 Const wbemFlagReturnImmediately = &h10
 Const wbemFlagForwardOnly = &h20
 arrComputers = Array("localhost")
 For Each strComputer In arrComputers
   
  Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\MSCluster")
  Set colItems = objWMIService.ExecQuery("SELECT * FROM MSCluster_NodeToActiveGroup""WQL", _
                                          wbemFlagReturnImmediately + wbemFlagForwardOnly)
  For Each objItem In colItems
    
   strnodename = right(objItem.GroupComponent,count)
   strnodename1 = left(strnodename,count1)
    
   if len(strnodename1)>0 then
    'WScript.Echo "Active Cluster node is " & strnodename1
    GetActiveClusterNode= strnodename1
   end if
     
  Next
 
 Next
 WScript.Echo "Active Cluster node is " + strnodename1
 Set objWMIService = Nothing
 Set wshShell = Nothing
End Function
 
Sub CheckWMIError()
 
   if Err <> 0 Then
      On Error Resume Next
 
      Dim strErrDesc: strErrDesc = Err.Description
      Dim ErrNum: ErrNum = Err.Number
      Dim WMIError : Set WMIError = CreateObject("WbemScripting.SwbemLastError")
   Dim FinalMessage
 
      if ( TypeName(WMIError) = "Empty" ) then
         FinalMessage strErrDesc & " (HRESULT: " & Hex(ErrNum) & ")."
      else
         FinalMessage= WMIError.Description & "(HRESULT: " & Hex(ErrNum) & ")."
         Set WMIError = nothing
      end if
      Call WriteWinAppLog(FinalMessage,Log_Code_Error)
   Call SendErrMail("Error starting " & strGlobalHost & " " & FinalMessage)
      ' if you want to quit on err: wscript.quit 0
   end if
 
End Sub
 
Sub WriteWinAppLog(Message,Log_Code)
Dim objShell
 
 Set objShell = Wscript.CreateObject("Wscript.Shell")
 
 objShell.LogEvent Log_Code,Message
  
 Set objShell = Nothing
 
End Sub
 
' This subroutine sends an email out for the error. email address and smtp server are hard coded
Sub SendErrMail(strMessage)
Dim strSMTPServer,strDestinationAddress
Dim objEmail
 strSMTPServer= "yoursmtp.yourcompany.com"
 ' set an email address to send errors to. This could also be taken from a command line parameter
 'strDestinationAddress="biztalkadmin@yourcompany.com"
 
  
 
 Set objEmail = CreateObject("CDO.Message")
 objEmail.From = strDestinationAddress
 objEmail. To = strDestinationAddress
 objEmail.Subject = "BizTalk " + What_Environment + ": Unable to start host instance"
 objEmail.Textbody = strMessage
 objEmail.Configuration.Fields.Item _
 objEmail.Configuration.Fields.Item _
        strSMTPServer
 objEmail.Configuration.Fields.Item _
 objEmail.Configuration.Fields.Update
 objEmail.Send
  
  
End Sub

यह भी देखें

BizTalk की एक व्यापक राशि को खोजने के लिए एक अन्य महत्वपूर्ण जगह से संबंधित आलेख TechNet Wiki है। श्रेष्ठ प्रविष्टि बिंदु है BizTalk सर्वर संसाधन TechNet विकी पर.