Exportieren (0) Drucken
Alle erweitern

Erstellen, Veröffentlichen und Verwalten eines Workflows für Workflow Manager 1.0

Zum Erstellen, Veröffentlichen und Verwalten von Workflows wird die Workflow Manager-API verwendet. In diesem Thema wird beschrieben, wie die Methoden und Klassen der Workflow Manager-API zum Arbeiten mit Workflows verwendet werden.

Erstellen von Workflows

Das Erstellen von Workflows in Workflow-Manager 1.0 ähnelt dem Erstellen in einer beliebigen Workflowumgebung. Workflows werden deklarativ mithilfe von XAML erstellt, das eine Hierarchie vordefinierter Aktivitäten definiert. Das folgende Codebeispiel (aus dem Beispiel "Benutzerdefinierte Aktivititäten") ist ein deklarativer Workflow, der für die Ausführung in Workflow-Manager 1.0 erstellt wird.

<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>

Der folgende Screenshot zeigt den in Visual Studio 2012 geöffneten Workflow.

GetMovies-Workflow

Der Workflow in diesem Beispiel ruft Spielfilminformationen von einem öffentlichen Webdienst basierend auf Suchparametern ab. Diese Parameter werden als Eigenschaften definiert (ein Suchschlüsselwort und eine Datensatzanzahl). Der Workflow gibt dann die abgerufenen Informationen als DynamicValue zurück und überlässt die Verarbeitung der enthaltenen Daten als Eigenschaftenbehälter dem Aufrufer.

Veröffentlichen von Workflows

Mithilfe von Workflow Manager gehostete Workflows müssen zuerst für einen Bereich veröffentlicht werden. Die Interaktion mit einem erfolgt mithilfe von WorkflowManagementClient. Das folgende Codebeispiel zeigt, wie ein Workflowbereich für die Zwecke dieses Beispiels erstellt wird.

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

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

Nachdem der Bereich eingerichtet wurde, kann der Workflow für den Bereich veröffentlicht werden. Alle XAML-Dokumente werden als Aktivitäten mithilfe einer ActivityDescription hochgeladen. Workflows erhalten dann zugehörige Metadaten über eine WorkflowDescription. Das folgende Codebeispiel zeigt, wie der Workflow und seine zugehörige Aktivität veröffentlicht werden.

// 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);

Verwalten von Workflows

Nachdem Workflows für Workflow Manager veröffentlicht wurden, werden sie ausgeführt, und ihr Status kann abgerufen werden. Das folgende Codebeispiel zeigt, wie ein veröffentlichter Workflow ausgeführt wird. Beim Starten eines Workflows wird ein WorkflowStartInfo-Objekt zum Speichern von Startinformationen verwendet. Dieser Vorgang ähnelt der Verwendung eines StartInfo-Objekts durch einen Prozess.

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);

Das folgende Codebeispiel zeigt, wie der Status eines ausgeführten Workflows abgefragt wird. Der Status wird als Zeichenfolge zurückgegeben.

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

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


Workflow Manager 1.0 MSDN Community Forum


Erstellungsdatum:

2013-10-23

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2015 Microsoft