Een langlopende werkstroomservice maken
In dit artikel wordt beschreven hoe u een langlopende werkstroomservice maakt, die gedurende lange tijd kan worden uitgevoerd. Op een bepaald moment kan de werkstroom inactief gaan wachten op aanvullende informatie. Wanneer dit gebeurt, wordt de werkstroom bewaard in een SQL-database en wordt deze uit het geheugen verwijderd. Wanneer de aanvullende informatie beschikbaar komt, wordt het werkstroomexemplaren weer in het geheugen geladen en wordt de uitvoering voortgezet.
In dit scenario implementeert u een vereenvoudigd bestelsysteem. De client verzendt een eerste bericht naar de werkstroomservice om de order te starten. Er wordt een order-id naar de client geretourneerd. Op dit moment wacht de werkstroomservice op een ander bericht van de client en wordt deze inactief en blijft behouden in een SQL Server-database. Wanneer de client het volgende bericht verzendt om een item te bestellen, wordt de werkstroomservice weer in het geheugen geladen en is de verwerking van de order voltooid.
In het codevoorbeeld wordt een tekenreeks geretourneerd waarin staat dat het item is toegevoegd aan de order. Het codevoorbeeld is niet bedoeld als een echte toepassing van de technologie, maar eerder een eenvoudig voorbeeld dat langdurige werkstroomservices illustreert.
Vereisten
U moet de volgende software hebben geïnstalleerd om deze procedure te kunnen gebruiken:
- Microsoft SQL Server 2008
- Visual Studio 2012
- Microsoft .NET Framework 4.6.1
U moet ook bekend zijn met WCF en Visual Studio 2012 en weten hoe u projecten/oplossingen kunt maken.
De SQL Database instellen
Als u wilt dat exemplaren van de werkstroomservice behouden blijven, moet Microsoft SQL Server zijn geïnstalleerd en moet u een database configureren om de persistente werkstroomexemplaren op te slaan. Voer Microsoft SQL Management Studio uit door op de knop Start te klikken, Alle programma's, Microsoft SQL Server 2008 en Microsoft SQL Management Studio te selecteren.
Klik op de knop Verbinding maken om u aan te melden bij het SQL Server-exemplaar
Klik met de rechtermuisknop op Databases in de structuurweergave en selecteer Nieuwe database om een nieuwe database te maken met de naam
SQLPersistenceStore
.Voer het SqlWorkflowInstanceStoreSchema.sql scriptbestand uit in de map C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en in de SQLPersistenceStore-database om de benodigde databaseschema's in te stellen.
Voer het SqlWorkflowInstanceStoreLogic.sql scriptbestand uit in de map C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en in de SQLPersistenceStore-database om de benodigde databaselogica in te stellen.
De web-hostwerkstroomservice maken
Maak een lege Visual Studio 2012-oplossing, geef deze de
OrderProcessing
naam.Voeg een nieuw WCF Workflow Service-toepassingsproject toe dat aan de oplossing wordt aangeroepen
OrderService
.Selecteer in het dialoogvenster Projecteigenschappen het tabblad Web .
Selecteer onder Actie starten de optie Specifieke pagina en geef op
Service1.xamlx
.Selecteer onder Servers Lokale IIS-webserver gebruiken.
Waarschuwing
U moet Visual Studio 2012 uitvoeren in de beheerdersmodus om deze instelling te maken.
Met deze twee stappen configureert u het werkstroomserviceproject dat wordt gehost door IIS.
Open
Service1.xamlx
als deze nog niet is geopend en verwijder de bestaande Activiteiten ReceiveRequest en SendResponse .Selecteer de sequentiële serviceactiviteit en klik op de koppeling Variabelen en voeg de variabelen toe die worden weergegeven in de volgende afbeelding. Hiermee worden enkele variabelen toegevoegd die later in de werkstroomservice worden gebruikt.
Notitie
Als CorrelationHandle zich niet in de vervolgkeuzelijst Variabeletype bevindt, selecteert u Bladeren naar typen in de vervolgkeuzelijst. Typ CorrelationHandle in het vak Typenaam , selecteer CorrelationHandle in de keuzelijst en klik op OK.
Sleep een ReceiveAndSendReply-activiteitssjabloon naar de sequentiële serviceactiviteit en zet deze neer. Deze reeks activiteiten ontvangt een bericht van een client en stuurt een antwoord terug.
Selecteer de ontvangstactiviteit en stel de eigenschappen in die in de volgende afbeelding zijn gemarkeerd.
Met de eigenschap DisplayName wordt de naam ingesteld die wordt weergegeven voor de activiteit Ontvangen in de ontwerpfunctie. De eigenschappen ServiceContractName en OperationName geven de naam op van het servicecontract en de bewerking die worden geïmplementeerd door de ontvangstactiviteit. Zie Contracten gebruiken in werkstroomservices voor meer informatie over hoe contracten worden gebruikt in werkstroomservices.
Klik op de koppeling Definiëren in de activiteit ReceiveStartOrder en stel de eigenschappen in die worden weergegeven in de volgende afbeelding. U ziet dat het keuzerondje Parameters is geselecteerd. Een benoemde
p_customerName
parameter is gebonden aan decustomerName
variabele. Hiermee configureert u de activiteit Ontvangen om bepaalde gegevens te ontvangen en deze gegevens te binden aan lokale variabelen.Selecteer de activiteit SendReplyToReceive en stel de gemarkeerde eigenschap in die wordt weergegeven in de volgende afbeelding.
Klik op de koppeling Definiëren in de activiteit SendReplyToStartOrder en stel de eigenschappen in die worden weergegeven in de volgende afbeelding. U ziet dat het keuzerondje Parameters is geselecteerd; een parameter met de naam
p_orderId
is gebonden aan deorderId
variabele. Met deze instelling geeft u op dat de activiteit SendReplyToStartOrder een waarde van het type tekenreeks retourneert naar de aanroeper.Sleep een toewijzingsactiviteit tussen de activiteiten Receive en SendReply en stel de eigenschappen in zoals wordt weergegeven in de volgende afbeelding:
Hiermee maakt u een nieuwe order-id en wordt de waarde in de orderId-variabele geplaatst.
Selecteer de activiteit ReplyToStartOrder . Klik in het eigenschappenvenster op de knop met het beletselteken voor CorrelationInitializers. Selecteer de koppeling Initializer toevoegen, voer
orderIdHandle
in het tekstvak Initializer in, selecteer initialisatie van querycorrelatie voor het correlatietype en selecteer p_orderId onder de vervolgkeuzelijst XPATH-query's. Deze instellingen worden weergegeven in de volgende afbeelding. Klik op OK. Hiermee initialiseert u een correlatie tussen de client en dit exemplaar van de werkstroomservice. Wanneer een bericht met deze order-id wordt ontvangen, wordt het doorgestuurd naar dit exemplaar van de werkstroomservice.
Sleep een andere ReceiveAndSendReply-activiteit naar het einde van de werkstroom (buiten de reeks met de eerste receive - en SendReply-activiteiten ). Dit ontvangt het tweede bericht dat door de client wordt verzonden en erop reageert.
Selecteer de reeks met de zojuist toegevoegde activiteiten ontvangen en verzenden en klik op de knop Variabelen . Voeg de variabele toe die in de volgende afbeelding is gemarkeerd:
orderResult
Voeg ook toe als tekenreeks in hetSequence
bereik.Selecteer de ontvangstactiviteit en stel de eigenschappen in die worden weergegeven in de volgende afbeelding:
Notitie
Vergeet niet om het veld ServiceContractName te wijzigen met
../IAddItem
.Klik op de koppeling Definiëren in de activiteit ReceiveAddItem en voeg de parameters toe die worden weergegeven in de volgende afbeelding: Hiermee configureert u de ontvangstactiviteit voor het accepteren van twee parameters, de order-id en de id van het bestelde item.
Klik op de knop Correleren met het beletselteken en voer in
orderIdHandle
. Klik onder XPath-query's op de vervolgkeuzepijl en selecteerp_orderId
. Hiermee configureert u de correlatie voor de tweede ontvangstactiviteit. Zie Correlatie voor meer informatie over correlatie.Sleep een If-activiteit direct na de ReceiveAddItem-activiteit en zet deze neer. Deze activiteit werkt net als een if-instructie.
Stel de eigenschap Voorwaarde in op
itemId=="Zune HD" (itemId="Zune HD" for Visual Basic)
Sleep een toewijzingsactiviteit naar de sectie Vervolgens en een andere naar de sectie Else om de eigenschappen van de activiteiten toewijzen in te stellen, zoals wordt weergegeven in de volgende afbeelding.
Als de voorwaarde de sectie Vervolgens is
true
, wordt de sectie Uitgevoerd. Als de voorwaarde de else-sectie isfalse
, wordt uitgevoerd.Selecteer de Activiteit SendReplyToReceive en stel de eigenschap DisplayName in die wordt weergegeven in de volgende afbeelding.
Klik op de koppeling Definiëren in de activiteit SetReplyToAddItem en configureer deze zoals wordt weergegeven in de volgende afbeelding. Hiermee configureert u de SendReplyToAddItem-activiteit om de waarde in de
orderResult
variabele te retourneren.
Open het bestand web.config en voeg de volgende elementen toe in de <sectie Gedrag> om werkstroompersistentie in te schakelen. (Zorg ervoor dat u de verbindingsreeks voltooit.)
<sqlWorkflowInstanceStore connectionString="...;Asynchronous Processing=True" instanceEncodingOption="None" instanceCompletionAction="DeleteAll" instanceLockedExceptionAction="BasicRetry" hostLockRenewalPeriod="00:00:30" runnableInstancesDetectionPeriod="00:00:02" /> <workflowIdle timeToUnload="0"/>
Bouw de oplossing.
Een clienttoepassing maken om de werkstroomservice aan te roepen
Voeg een nieuw consoletoepassingsproject toe dat aan de oplossing wordt aangeroepen
OrderClient
.Verwijzingen toevoegen aan de volgende assembly's aan het
OrderClient
projectSystem.ServiceModel.dll
System.ServiceModel.Activities.dll
Voeg een servicereferentie toe aan de werkstroomservice en geef
OrderService
deze op als de naamruimte.Voeg in de
Main()
methode van het clientproject de volgende code toe:static void Main(string[] args) { // Send initial message to start the workflow service Console.WriteLine("Sending start message"); StartOrderClient startProxy = new StartOrderClient(); string orderId = startProxy.StartOrder("Kim Abercrombie"); // The workflow service is now waiting for the second message to be sent Console.WriteLine("Workflow service is idle..."); Console.WriteLine("Press [ENTER] to send an add item message to reactivate the workflow service..."); Console.ReadLine(); // Send the second message Console.WriteLine("Sending add item message"); AddItemClient addProxy = new AddItemClient(); AddItem item = new AddItem(); item.p_itemId = "Zune HD"; item.p_orderId = orderId; string orderResult = addProxy.AddItem(item); Console.WriteLine("Service returned: " + orderResult); }
Bouw de oplossing en voer de
OrderClient
toepassing uit. De client geeft de volgende tekst weer:Sending start messageWorkflow service is idle...Press [ENTER] to send an add item message to reactivate the workflow service...
Als u wilt controleren of de werkstroomservice is behouden, start u SQL Server Management Studio door naar het menu Start te gaan, Alle programma's, Microsoft SQL Server 2008, SQL Server Management Studio te selecteren.
- Vouw in het linkerdeelvenster databases, SQLPersistenceStore, Weergaven en klik met de rechtermuisknop op System.Activities.DurableInstancing.Instances en selecteer Top 1000 rijen selecteren. Controleer in het deelvenster Resultaten of er ten minste één exemplaar wordt vermeld. Er kunnen andere exemplaren zijn van eerdere uitvoeringen als er een uitzondering is opgetreden tijdens het uitvoeren. U kunt bestaande rijen verwijderen door met de rechtermuisknop op System.Activities.DurableInstancing.Instances te klikken en Top 200 rijen bewerken te selecteren, op de knop Uitvoeren te drukken, alle rijen in het resultatenvenster te selecteren en verwijderen te selecteren. Als u wilt controleren of het exemplaar dat in de database wordt weergegeven, het exemplaar is dat uw toepassing heeft gemaakt, controleert u of de weergave exemplaren leeg is voordat u de client uitvoert. Zodra de client de query opnieuw uitvoert (top 1000 rijen selecteren) en controleert u of er een nieuw exemplaar is toegevoegd.
Druk op Enter om het bericht item toevoegen naar de werkstroomservice te verzenden. De client geeft de volgende tekst weer:
Sending add item messageService returned: Item added to orderPress any key to continue . . .