Consultando Instancias de Servicios en BizTalk 2006

Existen dos formas de consultar instancias de servicios en BizTalk Server 2006, utilizando WMI o utilizando Microsoft.Biztalk.Operations.

WMI

Usando WQL se puede realizar una consulta a la clase MSBTS_ServiceInstance y retornar todas las instancias de servicio con sus respectivos valores dados por el proveedor para WMI en BizTalk.  Esta opción es válida en BizTalk 2004 y BizTalk 2006.

 using System.Management;
......


ManagementObjectSearcher searcher = 
    new ManagementObjectSearcher("root\\MicrosoftBizTalkServer", 
    "SELECT * FROM MSBTS_ServiceInstance"); 

foreach (ManagementObject queryObj in searcher.Get())
{
    Console.WriteLine("-----------------------------------");
    Console.WriteLine("MSBTS_ServiceInstance instance");
    Console.WriteLine("-----------------------------------");
    Console.WriteLine("ActivationTime: {0}", queryObj["ActivationTime"]);
    Console.WriteLine("ErrorCategory: {0}", queryObj["ErrorCategory"]);
    Console.WriteLine("ErrorDescription: {0}", queryObj["ErrorDescription"]);
    Console.WriteLine("ErrorId: {0}", queryObj["ErrorId"]);
    Console.WriteLine("HostName: {0}", queryObj["HostName"]);
    Console.WriteLine("InstanceID: {0}", queryObj["InstanceID"]);
    Console.WriteLine("MgmtDbNameOverride: {0}", queryObj["MgmtDbNameOverride"]);
    Console.WriteLine("MgmtDbServerOverride: {0}", queryObj["MgmtDbServerOverride"]);
    Console.WriteLine("PendingOperation: {0}", queryObj["PendingOperation"]);
    Console.WriteLine("PendingOperationTime: {0}", queryObj["PendingOperationTime"]);
    Console.WriteLine("ServiceClass: {0}", queryObj["ServiceClass"]);
    Console.WriteLine("ServiceClassId: {0}", queryObj["ServiceClassId"]);
    Console.WriteLine("ServiceName: {0}", queryObj["ServiceName"]);
    Console.WriteLine("ServiceStatus: {0}", queryObj["ServiceStatus"]);
    Console.WriteLine("ServiceTypeId: {0}", queryObj["ServiceTypeId"]);
    Console.WriteLine("Status: {0}", queryObj["Status"]);
    Console.WriteLine("SuspendTime: {0}", queryObj["SuspendTime"]);
}

Microsoft.BizTalk.Operations

Otra forma es utilizar Microsoft.Biztalk.Operations, esta librería viene en BizTalk 2006 y permite consultar instancias de servicios y/o mensajes a la base de datos MessageBox o a la base de datos de traceo (Tracking).  A diferencia de los resultados retornados en WMI, M.B.O. devuelve una coleccion de objetos que se mapean a difernetes clases de acuerdo al tipo de instancia de servicio tal como se muestra en el código de ejemplo.

De igual forma, M.B.O. tiene información que WMI no retorna como el nombre de la aplicación, si esta en breakpoint, y si el puerto de envío es el primario, entre otras.

 using Microsoft.BizTalk.Operations;
......

BizTalkOperations ops = new BizTalkOperations();
IEnumerable enumb = ops.GetServiceInstances();
IEnumerator enumt = enumb.GetEnumerator();

while (enumt.MoveNext())
{
    object inst = enumt.Current;

    if (inst is Instance)
    {
        Instance instance = inst as Instance;
        Console.WriteLine(instance.Class);
        Console.WriteLine(instance.CreationTime);
        Console.WriteLine(instance.ErrorDescription);
        Console.WriteLine(instance.HostName);
        Console.WriteLine(instance.ID);
        Console.WriteLine(instance.InstanceStatus);
        Console.WriteLine(instance.ServiceType);
        Console.WriteLine(instance.ServiceTypeID);
    }

    if (inst is MessageBoxServiceInstance)
    {
        MessageBoxServiceInstance msginst = inst as MessageBoxServiceInstance;
        Console.WriteLine(msginst.Adapter);
        Console.WriteLine(msginst.Application);
        Console.WriteLine(msginst.CurrentProcessingServer);
        Console.WriteLine(msginst.ErrorCategory);
        Console.WriteLine(msginst.ErrorCode);
        Console.WriteLine(msginst.ErrorProcessingServer);
        Console.WriteLine(msginst.MessageBox);
        Console.WriteLine(msginst.PendingOperation);
        Console.WriteLine(msginst.PendingOperationSubmitTime);
        Console.WriteLine(msginst.SuspendTime);
        Console.WriteLine(msginst.URI);
    }

    if (inst is SendPortInstance)
    {
        SendPortInstance spinst = inst as SendPortInstance;
        Console.WriteLine(spinst.HasServiceWindow());
        Console.WriteLine(spinst.IsPrimaryTransport());
        Console.WriteLine(spinst.Priority);
        Console.Write(spinst.ServiceWindowEnd);
        Console.Write(spinst.ServiceWindowStart);
    }

    if (inst is TrackedServiceInstance)
    {
        TrackedServiceInstance tinst = inst as TrackedServiceInstance;
        Console.WriteLine(tinst.EndTime);
        Console.WriteLine(tinst.ExitCode);
        Console.WriteLine(tinst.TrackingDb);
    }

    if (inst is OrchestrationInstance)
    {
        OrchestrationInstance oinst = inst as OrchestrationInstance;
        Console.WriteLine(oinst.InBreakpoint);
        Console.WriteLine(oinst.UserState);
    }

    if (inst is MSMQtInstance)
    {
        MSMQtInstance minst = inst as MSMQtInstance;
        Console.WriteLine(minst.InboundUserState);
        Console.WriteLine(minst.MSMQtDirection);
        Console.WriteLine(minst.OutboundUserState);
    }
}

 

Autor: Carlos Medina
Este mensaje se proporciona "como está" sin garantías de ninguna clase, y no otorga ningun derecho