Operations Manager Management Pack tasks can run in either a synchronous or an asynchronous mode. When an SDK client runs a task in a synchronous mode, the task runs in the client's thread. This requires the client to delay until the task is complete.
Example
The following example demonstrates how to synchronously run a task to get the names of rules and monitors that are running on a specific agent-managed computer.
Visual Basic | Copy Code |
---|---|
' Synchronously runs a task to get a list of ' rules or monitors running on a specific agent-managed computer. Imports System Imports System.Collections.Generic Imports System.Collections.ObjectModel Imports Microsoft.EnterpriseManagement Imports Microsoft.EnterpriseManagement.Administration Imports Microsoft.EnterpriseManagement.Common Imports Microsoft.EnterpriseManagement.Configuration Imports Microsoft.EnterpriseManagement.Monitoring Imports System.Xml Imports System.Text Namespace SDKSamples Class Program Public Overloads Shared Function Main(ByVal args() As String) As Integer Dim mg As ManagementGroup = New ManagementGroup("localhost") Console.WriteLine("Synchronously running a Management Pack task...") ' Get the task. Dim query As String = "DisplayName = 'Show running rules and monitors for this health service'" Dim taskCriteria As MonitoringTaskCriteria = New MonitoringTaskCriteria(query) Dim tasks As ReadOnlyCollection(Of MonitoringTask) = _ mg.GetMonitoringTasks(taskCriteria) Dim task As MonitoringTask = Nothing If (tasks.Count = 1) Then task = tasks(0) else Throw New InvalidOperationException( _ "Error! Expected one task with: " & query) End If ' Get the agent class. query = "Name = 'Microsoft.SystemCenter.Agent'" Dim criteria As MonitoringClassCriteria = New MonitoringClassCriteria(query) Dim classes As ReadOnlyCollection(Of MonitoringClass) = _ mg.GetMonitoringClasses(criteria) If (classes.Count <> 1) Then Throw New InvalidOperationException( _ "Error! Expected one class with: " & query) End If ' Create a MonitoringObject list containing a specific agent (the ' target of the task). Dim fullAgentName As String = "EnterFullyQualifiedAgentNameHere" Dim targets As List(Of MonitoringObject) = New List(Of MonitoringObject)() query = "DisplayName = '" & fullAgentName & "'" Dim targetCriteria As MonitoringObjectCriteria = _ New MonitoringObjectCriteria(query, classes(0)) targets.AddRange(mg.GetMonitoringObjects(targetCriteria)) If (targets.Count <> 1) Then Throw New InvalidOperationException( _ "Error! Expected one target.") End If ' Use the default task configuration. Dim config As MonitoringTaskConfiguration = New MonitoringTaskConfiguration() ' Run the task. Console.WriteLine("Starting task """ & _ task.DisplayName & """ on the following target: ") For Each target As MonitoringObject In targets Console.WriteLine(target.DisplayName) Next Console.WriteLine("Task started.") Dim results As ReadOnlyCollection(Of MonitoringTaskResult) = _ mg.ExecuteMonitoringTask(targets, task, config) If (results.Count = 0) Then Throw New InvalidOperationException( _ "Failed to return any results.") End If ' Display the task results. Dim resultNo As Integer = 0 For Each res As MonitoringTaskResult In results resultNo = resultNo + 1 If (res.Status = TaskStatus.Failed) Then Console.WriteLine("Target #" & resultNo & " failed.") Console.WriteLine("Reason: " & res.ErrorCode.Value) Else Console.WriteLine("Target #" & resultNo & " succeeded.") ' Convert the task Output element from a string to XML. Dim xmlDoc As XmlDocument = New XmlDocument() xmlDoc.LoadXml(res.Output) ' Parse and display the output. Dim xPathQry As String = "/DataItem/Count" Dim countNode As XmlNode = xmlDoc.SelectSingleNode(xPathQry) Console.WriteLine("Target contains " & countNode.InnerText & " running rules or monitors.") xPathQry = "//Workflow" Dim instanceList As XmlNodeList = xmlDoc.SelectNodes(xPathQry) Dim cnt As Integer = 0 For Each thisInstance As XmlNode In instanceList cnt = cnt + 1 Console.WriteLine(cnt.ToString() & ". " & thisInstance.InnerText) Next End If Next End Function End Class End Namespace |
C# | Copy Code |
---|---|
/// <summary> /// Synchronously runs a task to get a list of /// rules or monitors running on a specific agent-managed computer. /// </summary> using System; using System.Collections.Generic; using System.Collections.ObjectModel; using Microsoft.EnterpriseManagement; using Microsoft.EnterpriseManagement.Administration; using Microsoft.EnterpriseManagement.Common; using Microsoft.EnterpriseManagement.Configuration; using Microsoft.EnterpriseManagement.Monitoring; using System.Xml; using System.Text; namespace SDKSamples { class Program { static void Main(string[] args) { ManagementGroup mg = new ManagementGroup("localhost"); Console.WriteLine("Synchronously running a Management Pack task..."); // Get the task. string query = "DisplayName = 'Show running rules and monitors for this health service'"; MonitoringTaskCriteria taskCriteria = new MonitoringTaskCriteria(query); ReadOnlyCollection<MonitoringTask> tasks = mg.GetMonitoringTasks(taskCriteria); MonitoringTask task = null; if (tasks.Count == 1) task = tasks[0]; else throw new InvalidOperationException( "Error! Expected one task with: " + query); // Get the agent class. query = "Name = 'Microsoft.SystemCenter.Agent'"; MonitoringClassCriteria criteria = new MonitoringClassCriteria(query); ReadOnlyCollection<MonitoringClass> classes = mg.GetMonitoringClasses(criteria); if (classes.Count != 1) throw new InvalidOperationException( "Error! Expected one class with: " + query); // Create a MonitoringObject list containing a specific agent (the // target of the task). string fullAgentName = "EnterFullyQualifiedAgentNameHere"; List<MonitoringObject> targets = new List<MonitoringObject>(); query = "DisplayName = '" + fullAgentName + "'"; MonitoringObjectCriteria targetCriteria = new MonitoringObjectCriteria(query, classes[0]); targets.AddRange(mg.GetMonitoringObjects(targetCriteria)); if (targets.Count != 1) throw new InvalidOperationException( "Error! Expected one target."); // Use the default task configuration. MonitoringTaskConfiguration config = new MonitoringTaskConfiguration(); // Run the task. Console.WriteLine("Starting task \"" + task.DisplayName + "\" on the following target: "); foreach (MonitoringObject target in targets) { Console.WriteLine(target.DisplayName); } Console.WriteLine("Task started."); ReadOnlyCollection<MonitoringTaskResult> results = mg.ExecuteMonitoringTask(targets, task, config); if (results.Count == 0) throw new InvalidOperationException( "Failed to return any results."); // Display the task results. int resultNo = 0; foreach (MonitoringTaskResult res in results) { resultNo++; if (res.Status == TaskStatus.Failed) { Console.WriteLine("Target #" + resultNo + " failed."); Console.WriteLine("Reason: " + res.ErrorCode.Value); } else { Console.WriteLine("Target #" + resultNo + " succeeded."); // Convert the task Output element from a string to XML. XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(res.Output); // Parse and display the output. string xPathQry = @"/DataItem/Count"; System.Xml.XmlNode countNode = xmlDoc.SelectSingleNode(xPathQry); Console.WriteLine("Target contains " + countNode.InnerText + " running rules or monitors."); xPathQry = @"//Workflow"; System.Xml.XmlNodeList instanceList = xmlDoc.SelectNodes(xPathQry); int cnt = 0; foreach (System.Xml.XmlNode thisInstance in instanceList) { cnt++; Console.WriteLine(cnt.ToString() + ". " + thisInstance.InnerText); } } } } } } |
See Also
Send comments about this topic to Microsoft.