Como criar, publicar e gerenciar um fluxo de trabalho para o Workflow Manager Tools 1.0

 

Publicado: maio de 2016

Criação, publicação e gerenciamento de fluxos de trabalho usando a API do Gerenciador de Fluxo de Trabalho.Este tópico descreve como usar os métodos e as classes da API do Gerenciador de Fluxo de Trabalho Client para trabalhar com fluxos de trabalho.

A criação de fluxos de trabalho no Workflow Manager 1.0 é semelhante à criação em qualquer ambiente de fluxo de trabalho.Os fluxos de trabalho são criados declarativamente usando XAML que define a hierarquia de atividades predefinidas.O seguinte exemplo de código (da amostra Atividades Personalizadas) é um fluxo de trabalho declarativo criado para ser executado no Workflow Manager 1.0.

<Activity mc:Ignorable="sap sap2010 sads" x:Class="MoviesActivityLibrary.GetMovies"
 xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities"
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 xmlns:mca="clr-namespace:Microsoft.CSharp.Activities;assembly=System.Activities"
 xmlns:p="http://schemas.microsoft.com/workflow/2012/07/xaml/activities"
 xmlns:sads="http://schemas.microsoft.com/netfx/2010/xaml/activities/debugger"
 xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation"
 xmlns:sap2010="http://schemas.microsoft.com/netfx/2010/xaml/activities/presentation"
 xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib"
 xmlns:sco="clr-namespace:System.Collections.ObjectModel;assembly=mscorlib"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <x:Members>
    <x:Property Name="searchKeyword" Type="InArgument(x:String)" />
    <x:Property Name="numItems" Type="InArgument(x:Int32)" />
    <x:Property Name="videoDV" Type="OutArgument(p:DynamicValue)" />
  </x:Members>
  <sap2010:ExpressionActivityEditor.ExpressionActivityEditor>C#</sap2010:ExpressionActivityEditor.ExpressionActivityEditor>
  <sap2010:WorkflowViewState.IdRef>ActivityLibrary2.Activity1_1</sap2010:WorkflowViewState.IdRef>
  <TextExpression.NamespacesForImplementation>
    <sco:Collection x:TypeArguments="x:String">
      <x:String>System</x:String>
      <x:String>System.Collections.Generic</x:String>
      <x:String>System.Data</x:String>
      <x:String>System.Linq</x:String>
      <x:String>System.Text</x:String>
      <x:String>Microsoft.Activities</x:String>
    </sco:Collection>
  </TextExpression.NamespacesForImplementation>
  <TextExpression.ReferencesForImplementation>
    <sco:Collection x:TypeArguments="AssemblyReference">
      <AssemblyReference>Microsoft.Activities</AssemblyReference>
      <AssemblyReference>Microsoft.CSharp</AssemblyReference>
      <AssemblyReference>Microsoft.Workflow.Common</AssemblyReference>
      <AssemblyReference>Microsoft.Workflow.Tracing</AssemblyReference>
      <AssemblyReference>System</AssemblyReference>
      <AssemblyReference>System.Activities</AssemblyReference>
      <AssemblyReference>System.Core</AssemblyReference>
      <AssemblyReference>System.Data</AssemblyReference>
      <AssemblyReference>System.Runtime.Serialization</AssemblyReference>
      <AssemblyReference>System.ServiceModel</AssemblyReference>
      <AssemblyReference>System.ServiceModel.Activities</AssemblyReference>
      <AssemblyReference>System.Xaml</AssemblyReference>
      <AssemblyReference>System.Xml</AssemblyReference>
      <AssemblyReference>System.Xml.Linq</AssemblyReference>
      <AssemblyReference>mscorlib</AssemblyReference>
      <AssemblyReference>MoviesActivityLibrary</AssemblyReference>
    </sco:Collection>
  </TextExpression.ReferencesForImplementation>
  <Sequence DisplayName="GetMovies" sap2010:WorkflowViewState.IdRef="Sequence_1">
    <p:HttpGet DisplayName="HttpGetFromNetflix" sap2010:WorkflowViewState.IdRef="HttpGet_1" RetryOnConnectionFailure="True">
      <p:HttpGet.ResponseContent>
        <OutArgument x:TypeArguments="p:DynamicValue">
          <mca:CSharpReference x:TypeArguments="p:DynamicValue">videoDV</mca:CSharpReference>
        </OutArgument>
      </p:HttpGet.ResponseContent>
      <p:HttpGet.Uri>
        <InArgument x:TypeArguments="x:String">
          <mca:CSharpValue x:TypeArguments="x:String">"http://odata.netflix.com/Catalog/Titles?$filter=substringof('" + searchKeyword + "', Name)&amp;$format=json&amp;$top=" + numItems + "&amp;$select=Name, Synopsis"</mca:CSharpValue>
        </InArgument>
      </p:HttpGet.Uri>
    </p:HttpGet>
    <sads:DebugSymbol.Symbol>d3dcXHNjcmF0Y2gyXHNjcmF0Y2hcZ2dvZ29sb1xCMiAtIFRlc3RcQ3VzdG9tQ29kZUFjdGl2aXRpZXNcQ3VzdG9tQ29kZUFjdGl2aXR5U2FtcGxlXE1vdmllc0FjdGl2aXR5TGlicmFyeVxHZXRNb3ZpZXMueGFtbAQxAz8OAgEBMgU9EQIBAjoLOusBAgEHNQs1XgIBAw==</sads:DebugSymbol.Symbol>
  </Sequence>
  <sap2010:WorkflowViewState.ViewStateManager>
    <sap2010:ViewStateManager>
      <sap2010:ViewStateData Id="HttpGet_1" sap:VirtualizedContainerService.HintSize="284,120" />
      <sap2010:ViewStateData Id="Sequence_1" sap:VirtualizedContainerService.HintSize="306,244">
        <sap:WorkflowViewStateService.ViewState>
          <scg:Dictionary x:TypeArguments="x:String, x:Object">
            <x:Boolean x:Key="IsExpanded">True</x:Boolean>
          </scg:Dictionary>
        </sap:WorkflowViewStateService.ViewState>
      </sap2010:ViewStateData>
      <sap2010:ViewStateData Id="ActivityLibrary2.Activity1_1" sap:VirtualizedContainerService.HintSize="346,324" />
    </sap2010:ViewStateManager>
  </sap2010:WorkflowViewState.ViewStateManager>
</Activity>

A captura de tela a seguir mostra o fluxo de trabalho aberto no Visual Studio 2012.

GetMovies Workflow

O fluxo de trabalho neste exemplo obtém informações sobre um filme de um serviço Web público com base nos parâmetros de pesquisa.Esses parâmetros são definidos como propriedades (uma palavra-chave de pesquisa e um contador de resultados).Em seguida, o fluxo de trabalho retorna as informações obtidas como um DynamicValue, permitindo que o chamador manipule os dados retornados como um recipiente de propriedades.

Os fluxos de trabalho hospedados pelo Gerenciador de Fluxo de Trabalho primeiro devem ser publicados em um escopo.A interação com um escopo é realizada por meio do WorkflowManagementClient.O exemplo de código a seguir demonstra como criar um escopo de fluxo de trabalho para ser usado neste exemplo.

var rootClient = new WorkflowManagementClient(new Uri(rootScope));

            return rootClient.CurrentScope.PublishChildScope(scopeName,
                new ScopeDescription()
                {
                    UserComments = string.Format("For {0} sample only", scopeName)
                });

Uma vez que o escopo foi estabelecido, o fluxo de trabalho poderá ser publicado no escopo.Todos os documentos XAML são carregados como atividades por meio de um ActivityDescription.Em seguida, os fluxos de trabalho recebem os metadados associados por meio de um WorkflowDescription.O exemplo de código a seguir demonstra como publicar o fluxo de trabalho e sua atividade correspondente.

// publish the activity description related with the workflow
client.Activities.Publish(
new ActivityDescription(WorkflowUtils.Translate(xamlFilePath)) { Name = workflowName });

// now, publish the workflow description
WorkflowDescription description = new WorkflowDescription
{
Name = workflowName,
ActivityPath = workflowName,
// additional properties elided for simplicity
};

// publish!
client.Workflows.Publish(description);

Depois que os fluxos de trabalho são publicados no Gerenciador de Fluxo de Trabalho, eles são executados e é possível obter seu status.O exemplo de código a seguir demonstra como executar um fluxo de trabalho publicado.A inicialização de um fluxo de trabalho usa o objeto T:Microsoft.Workflow.Client.WorkflowStartInfo para armazenar informações de início, semelhante ao modo como um processo usa o objeto StartInfo.

Console.Write("Starting workflow instance...");
WorkflowStartParameters startParameters = new WorkflowStartParameters();
startParameters.Content.Add("Title", "Titanic");
startParameters.Content.Add("NumberOfMovies", 3);
string instanceId = client.Workflows.Start(workflowName, startParameters);

O exemplo de código a seguir demonstra como solicitar o status de um fluxo de trabalho em execução.O status é retornado como uma cadeia de caracteres.

WorkflowInstanceInfo instanceInfo = client.Instances.Get(workflowName, instanceId);
currentStatus = instanceInfo.UserStatus;

if (instanceInfo.WorkflowStatus == WorkflowInstanceStatus.Completed)
{
    Console.WriteLine("\nWorkflow instance completed");
}

Contribuições da comunidade

ADICIONAR
Mostrar: