Compartilhar via


Acompanhamento personalizado

O exemplo CustomTracking demonstra como criar um participante de rastreamento personalizado e gravar o conteúdo dos dados de acompanhamento no console. Além disso, o exemplo demonstra como emitir CustomTrackingRecord objetos preenchidos com dados definidos pelo usuário. O participante de acompanhamento baseado em console filtra os TrackingRecord objetos emitidos pelo fluxo de trabalho usando um objeto de perfil de acompanhamento criado em código.

Detalhes de exemplo

O Windows Workflow Foundation (WF) fornece uma infraestrutura de acompanhamento para acompanhar a execução de uma instância de fluxo de trabalho. O mecanismo de acompanhamento executa uma instância de fluxo de trabalho para gerar eventos relacionados ao ciclo de vida do fluxo de trabalho, eventos de atividades de fluxo de trabalho e eventos de rastreamento personalizados. A tabela a seguir detalha os componentes primários da infraestrutura de acompanhamento.

Componente Descrição
Monitoramento do tempo de execução Fornece a infraestrutura para emitir registros de acompanhamento.
Acompanhamento de participantes Consome os registros de rastreamento. O .NET Framework 4 é fornecido com um participante de acompanhamento que grava registros de acompanhamento como eventos de Rastreamento de Eventos para Windows (ETW).
Controlando o perfil Um mecanismo de filtragem que permite que um participante de rastreamento assine para um subconjunto de registros de rastreamento emissores de uma instância de fluxo de trabalho.

A tabela a seguir detalha os registros de rastreamento que o tempo de execução do fluxo de trabalho emite.

Registro de rastreamento Descrição
Registros de rastreamento de instância de fluxo de trabalho. Descreve o ciclo de vida da instância de fluxo de trabalho. Por exemplo, um registro de instância é emitido quando o fluxo de trabalho é iniciado ou concluído.
Estado da atividade que acompanha registros. Detalha a execução da atividade. Esses registros indicam o estado de uma atividade de fluxo de trabalho como quando uma atividade é agendada ou quando a atividade completa ou quando uma falha é lançada.
Registro de ressunção do indexador. Emitido sempre que um marcador dentro de uma instância de fluxo de trabalho é retomado.
Registros de acompanhamento personalizados. Um autor de fluxo de trabalho pode criar registros de rastreamento personalizados e emitê-los dentro da atividade personalizada.

O participante de rastreamento assinatura para um subconjunto dos objetos emissores de TrackingRecord usando perfis de rastreamento. Um perfil de acompanhamento contém consultas de acompanhamento que permitem a assinatura de um tipo de registro de acompanhamento específico. Os perfis de acompanhamento podem ser especificados no código ou na configuração.

Participante de rastreamento personalizada

O participante API de rastreamento permite a extensão de rastreamento com um usuário fornecido pelo participante que pode incluir a lógica personalizada para manipular os objetos de TrackingRecord emissores em runtime de fluxo de trabalho.

Para gravar um participante de rastreamento o usuário deve implementar TrackingParticipant. Especificamente, o Track método precisa ser implementado pelo participante personalizado. Esse método é chamado quando um TrackingRecord é emitido pelo runtime do fluxo de trabalho.

public abstract class TrackingParticipant
{
    protected TrackingParticipant();

    public virtual TrackingProfile TrackingProfile { get; set; }
    public abstract void Track(TrackingRecord record, TimeSpan timeout);
}

O participante de acompanhamento completo é implementado no arquivo ConsoleTrackingParticipant.cs. O exemplo de código a seguir é o método Track para o participante de acompanhamento personalizado.

protected override void Track(TrackingRecord record, TimeSpan timeout)
{
    ...
    WorkflowInstanceRecord workflowInstanceRecord = record as WorkflowInstanceRecord;
    if (workflowInstanceRecord != null)
    {
        Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
            " Workflow InstanceID: {0} Workflow instance state: {1}",
            record.InstanceId, workflowInstanceRecord.State));
    }

    ActivityStateRecord activityStateRecord = record as ActivityStateRecord;
    if (activityStateRecord != null)
    {
        IDictionary<String, object> variables = activityStateRecord.Variables;
        StringBuilder vars = new StringBuilder();

        if (variables.Count > 0)
        {
            vars.AppendLine("\n\tVariables:");
            foreach (KeyValuePair<string, object> variable in variables)
            {
                vars.AppendLine(String.Format(
                    "\t\tName: {0} Value: {1}", variable.Key, variable.Value));
            }
        }
        Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
            " :Activity DisplayName: {0} :ActivityInstanceState: {1} {2}",
                activityStateRecord.Activity.Name, activityStateRecord.State,
            ((variables.Count > 0) ? vars.ToString() : String.Empty)));
    }

    CustomTrackingRecord customTrackingRecord = record as CustomTrackingRecord;

    if ((customTrackingRecord != null) && (customTrackingRecord.Data.Count > 0))
    {
        ...
    }
    Console.WriteLine();

}

O exemplo de código a seguir adiciona o participante do console ao invocador de fluxo de trabalho.

ConsoleTrackingParticipant customTrackingParticipant = new ConsoleTrackingParticipant()
{
    ...
    // The tracking profile is set here, refer to Program.CS
...
}

WorkflowInvoker invoker = new WorkflowInvoker(BuildSampleWorkflow());
invoker.Extensions.Add(customTrackingParticipant);

Emitindo registros de acompanhamento personalizados

Este exemplo também demonstra a capacidade de emitir objetos de CustomTrackingRecord de uma atividade personalizado de fluxo de trabalho:

O exemplo a seguir demonstra como emitir CustomTrackingRecord objetos dentro de uma atividade personalizada.

// Create the Custom Tracking Record
CustomTrackingRecord customRecord = new CustomTrackingRecord("OrderIn")
{
    Data =
    {
        {"OrderId", 200},
        {"OrderDate", "20 Aug 2001"}
    }
};

// Emit custom tracking record
context.Track(customRecord);

Para usar este exemplo

  1. Usando o Visual Studio, abra o arquivo de solução CustomTrackingSample.sln.

  2. Para criar a solução, pressione CTRL+SHIFT+B.

  3. Para executar a solução, pressione CTRL+F5.

Consulte também