Dela via


Skapa en långvarig arbetsflödestjänst

I det här avsnittet beskrivs hur du skapar en långvarig arbetsflödestjänst. Långvariga arbetsflödestjänster kan köras under långa tidsperioder. Vid något tillfälle kan arbetsflödet gå inaktivt i väntan på ytterligare information. När detta inträffar sparas arbetsflödet i en SQL-databas och tas bort från minnet. När ytterligare information blir tillgänglig läses arbetsflödesinstansen in i minnet igen och fortsätter att köras. I det här scenariot implementerar du ett mycket förenklat beställningssystem. Klienten skickar ett första meddelande till arbetsflödestjänsten för att starta ordern. Det returnerar ett order-ID till klienten. Nu väntar arbetsflödestjänsten på ett annat meddelande från klienten och hamnar i inaktivt tillstånd och sparas i en SQL Server-databas. När klienten skickar nästa meddelande för att beställa ett objekt läses arbetsflödestjänsten in i minnet igen och bearbetningen av ordern slutförs. I kodexemplet returneras en sträng som anger att objektet har lagts till i ordningen. Kodexemplet är inte avsett att vara en verklig tillämpning av tekniken, utan snarare ett enkelt exempel som illustrerar långvariga arbetsflödestjänster. Det här avsnittet förutsätter att du vet hur du skapar Visual Studio 2012-projekt och lösningar.

Förutsättningar

Du måste ha följande programvara installerad för att kunna använda den här genomgången:

  1. Microsoft SQL Server 2008

  2. Visual Studio 2012

  3. Microsoft .NET Framework 4.6.1

  4. Du är bekant med WCF och Visual Studio 2012 och vet hur du skapar projekt/lösningar.

Konfigurera SQL Database

  1. För att arbetsflödestjänstinstanser ska bevaras måste du ha Microsoft SQL Server installerat och du måste konfigurera en databas för att lagra de bevarade arbetsflödesinstanserna. Kör Microsoft SQL Management Studio genom att klicka på startknappen , välja Alla program, Microsoft SQL Server 2008 och Microsoft SQL Management Studio.

  2. Klicka på knappen Anslut för att logga in på SQL Server-instansen

  3. Högerklicka på Databaser i trädvyn och välj Ny databas.. Om du vill skapa en ny databas med namnet SQLPersistenceStore.

  4. Kör SqlWorkflowInstanceStoreSchema.sql-skriptfilen i katalogen C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en i SQLPersistenceStore-databasen för att konfigurera de databasscheman som behövs.

  5. Kör den SqlWorkflowInstanceStoreLogic.sql skriptfilen som finns i katalogen C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en i SQLPersistenceStore-databasen för att konfigurera den databaslogik som behövs.

Skapa den webbaserade arbetsflödestjänsten

  1. Skapa en tom Visual Studio 2012-lösning, ge den OrderProcessingnamnet .

  2. Lägg till ett nytt WCF Workflow Service Application-projekt som anropas OrderService till lösningen.

  3. I dialogrutan projektegenskaper väljer du fliken Webb .

    1. Under Startåtgärd väljer du Specifik sida och anger Service1.xamlx.

      Workflow Service Project Web Properties

    2. Under Servrar väljer du Använd lokal IIS-webbserver.

      Local Web Server Settings

      Varning

      Du måste köra Visual Studio 2012 i administratörsläge för att göra den här inställningen.

      De här två stegen konfigurerar arbetsflödestjänstprojektet som ska hanteras av IIS.

  4. Öppna Service1.xamlx om den inte redan är öppen och ta bort de befintliga aktiviteterna ReceiveRequest och SendResponse .

  5. Välj aktiviteten Sekventiell tjänst och klicka på länken Variabler och lägg till variablerna som visas i följande bild. När du gör detta läggs vissa variabler som kommer att användas senare i arbetsflödestjänsten.

    Kommentar

    Om CorrelationHandle inte finns i listrutan Variabeltyp väljer du Bläddra efter typer i listrutan. Skriv CorrelationHandle i rutan Typnamn , välj CorrelationHandle i listrutan och klicka på OK.

    Add Variables

  6. Dra och släpp en Aktivitetsmall för ReceiveAndSendReply till aktiviteten Sekventiell tjänst . Den här uppsättningen aktiviteter tar emot ett meddelande från en klient och skickar ett svar tillbaka.

    1. Välj aktiviteten Ta emot och ange de egenskaper som är markerade i följande bild.

      Set Receive Activity Properties

      Egenskapen DisplayName anger namnet som visas för aktiviteten Ta emot i designern. Egenskaperna ServiceContractName och OperationName anger namnet på det tjänstkontrakt och den åtgärd som implementeras av aktiviteten Ta emot. Mer information om hur kontrakt används i Arbetsflödestjänster finns i Använda kontrakt i arbetsflöde.

    2. Klicka på länken Definiera... i aktiviteten ReceiveStartOrder och ange egenskaperna som visas i följande bild. Observera att knappen Parametrar är markerad, en parameter med namnet p_customerName är bunden till variabeln customerName . Detta konfigurerar aktiviteten Ta emot för att ta emot vissa data och binda dessa data till lokala variabler.

      Setting the data received by the Receive activity

    3. Välj Aktiviteten SendReplyToReceive och ange den markerade egenskapen som visas i följande bild.

      Setting the properties of the SendReply activity

    4. Klicka på länken Definiera... i aktiviteten SendReplyToStartOrder och ange egenskaperna som visas i följande bild. Observera att knappen Parametrar är markerad. En parameter med namnet p_orderId är bunden till variabeln orderId . Den här inställningen anger att aktiviteten SendReplyToStartOrder returnerar ett värde av typen sträng till anroparen.

      Configuring the SendReply activity content data

    5. Dra och släpp en Tilldela-aktivitet mellan aktiviteterna Receive och SendReply och ange egenskaperna enligt följande bild:

      Adding an assign activity

      Detta skapar ett nytt order-ID och placerar värdet i variabeln orderId.

    6. Välj aktiviteten ReplyToStartOrder. I egenskapsfönstret klickar du på ellipsknappen för CorrelationInitializers. Välj länken Lägg till initierare, ange orderIdHandle i textrutan Initierare, välj Frågekorrelationsinitierare för korrelationstypen och välj p_orderId under listrutan XPATH-frågor. Inställningarna visas i följande bild. Klicka på OK. Detta initierar en korrelation mellan klienten och den här instansen av arbetsflödestjänsten. När ett meddelande som innehåller det här order-ID:t tas emot dirigeras det till den här instansen av arbetsflödestjänsten.

      Adding a correlation initializer

  7. Dra och släpp en annan ReceiveAndSendReply-aktivitet till slutet av arbetsflödet (utanför sekvensensom innehåller de första mottagnings- och SendReply-aktiviteterna). Detta tar emot det andra meddelandet som skickas av klienten och svarar på det.

    1. Välj den sekvens som innehåller de nyligen tillagda aktiviteterna Ta emot och SkickaReply och klicka på knappen Variabler . Lägg till variabeln markerad i följande bild:

      Adding new variables

      Lägg även till orderResult som Sträng i omfånget Sequence .

    2. Välj aktiviteten Ta emot och ange de egenskaper som visas i följande bild:

      Set the Receive activity properties

      Kommentar

      Glöm inte att ändra fältet ServiceContractName med ../IAddItem.

    3. Klicka på länken Definiera... i aktiviteten ReceiveAddItem och lägg till parametrarna som visas i följande bild:Detta konfigurerar mottagningsaktiviteten för att acceptera två parametrar, order-ID och ID för objektet som sorteras.

      Specifying parameters for the second receive

    4. Klicka på knappen CorrelateOn-ellips och ange orderIdHandle. Under XPath-frågor klickar du på listrutepilen och väljer p_orderId. Detta konfigurerar korrelationen för den andra mottagningsaktiviteten. Mer information om korrelation finns i Korrelation.

      Setting the CorrelatesOn property

    5. Dra och släpp en If-aktivitet omedelbart efter aktiviteten ReceiveAddItem . Den här aktiviteten fungerar precis som en if-instruktion.

      1. Ange egenskapen Villkor till itemId=="Zune HD" (itemId="Zune HD" for Visual Basic)

      2. Dra och släpp en Tilldela aktivitet i avsnittet Sedan och en annan i avsnittet Else anger egenskaperna för Tilldela aktiviteter enligt följande bild.

        Assigning the result of the service call

        Om villkoret är truekommer avsnittet Then att köras. Om villkoret är falseavsnittet Else körs.

      3. Välj aktiviteten SendReplyToReceive och ange egenskapen DisplayName som visas i följande bild.

        Setting the SendReply activity properties

      4. Klicka på länken Definiera ... i aktiviteten SetReplyToAddItem och konfigurera den enligt följande bild. Detta konfigurerar aktiviteten SendReplyToAddItem för att returnera värdet i variabeln orderResult .

        Setting the data binding for the SendReply activity

  8. Öppna filen web.config och lägg till följande element i beteendeavsnittet <> för att aktivera arbetsflödets beständighet.

    <sqlWorkflowInstanceStore connectionString="Data Source=your-machine\SQLExpress;Initial Catalog=SQLPersistenceStore;Integrated Security=True;Asynchronous Processing=True" instanceEncodingOption="None" instanceCompletionAction="DeleteAll" instanceLockedExceptionAction="BasicRetry" hostLockRenewalPeriod="00:00:30" runnableInstancesDetectionPeriod="00:00:02" />
              <workflowIdle timeToUnload="0"/>
    

    Varning

    Ersätt värd- och SQL Server-instansnamnet i föregående kodfragment.

  9. Skapa lösningen.

Skapa ett klientprogram för att anropa arbetsflödestjänsten

  1. Lägg till ett nytt konsolprogramprojekt som heter OrderClient i lösningen.

  2. Lägga till referenser till följande sammansättningar i OrderClient projektet

    1. System.ServiceModel.dll

    2. System.ServiceModel.Activities.dll

  3. Lägg till en tjänstreferens till arbetsflödestjänsten och ange OrderService som namnrymd.

  4. Main() I -metoden för klientprojektet lägger du till följande kod:

    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);
    }
    
  5. Skapa lösningen och kör programmet OrderClient . Klienten visar följande text:

    Sending start messageWorkflow service is idle...Press [ENTER] to send an add item message to reactivate the workflow service...
    
  6. Om du vill kontrollera att arbetsflödestjänsten har sparats startar du SQL Server Management Studio genom att gå till Start-menyn, Välj alla program, Microsoft SQL Server 2008, SQL Server Management Studio.

    1. I det vänstra fönstret expanderar du Databaser, SQLPersistenceStore, Vyer och högerklickar på System.Activities.DurableInstancing.Instances och väljer Välj de 1 000 översta raderna. I fönstret Resultat kontrollerar du att minst en instans visas. Det kan finnas andra instanser från tidigare körningar om ett undantag inträffade vid körning. Du kan ta bort befintliga rader genom att högerklicka på System.Activities.DurableInstancing.Instances och välja Redigera de 200 översta raderna, trycka på knappen Kör , markera alla rader i resultatfönstret och välja ta bort. Kontrollera att instansen som visas i databasen är den instans som ditt program skapade genom att kontrollera att instansvyn är tom innan klienten körs. När klienten körs kör du frågan igen (Välj de 1 000 översta raderna) och kontrollerar att en ny instans har lagts till.
  7. Tryck på Retur för att skicka meddelandet lägg till objekt till arbetsflödestjänsten. Klienten visar följande text:

    Sending add item messageService returned: Item added to orderPress any key to continue . . .
    

Se även