Udostępnij za pośrednictwem


Tworzenie długotrwałej usługi przepływu pracy

W tym artykule opisano sposób tworzenia długotrwałej usługi przepływu pracy, która może działać przez długi czas. W pewnym momencie przepływ pracy może bezczynnie czekać na dodatkowe informacje. W takim przypadku przepływ pracy jest utrwalany w bazie danych SQL i jest usuwany z pamięci. Gdy dodatkowe informacje staną się dostępne, wystąpienie przepływu pracy jest ładowane z powrotem do pamięci i kontynuuje wykonywanie.

W tym scenariuszu implementujesz uproszczony system porządkowania. Klient wysyła początkowy komunikat do usługi przepływu pracy w celu uruchomienia zamówienia. Zwraca identyfikator zamówienia do klienta. W tym momencie usługa przepływu pracy czeka na inny komunikat od klienta i przechodzi do stanu bezczynności i jest utrwalana w bazie danych programu SQL Server. Gdy klient wysyła następny komunikat, aby zamówić element, usługa przepływu pracy jest ładowana z powrotem do pamięci i kończy przetwarzanie zamówienia.

W przykładzie kodu zwraca on ciąg z informacją, że element został dodany do zamówienia. Przykładowy kod nie jest przeznaczony do rzeczywistego zastosowania technologii, ale raczej prostego przykładu, który ilustruje długotrwałe usługi przepływu pracy.

Wymagania wstępne

Aby korzystać z tego przewodnika, musisz mieć zainstalowane następujące oprogramowanie:

  1. Microsoft SQL Server 2008
  2. Visual Studio 2012
  3. Microsoft .NET Framework 4.6.1

Musisz również zapoznać się z programem WCF i programem Visual Studio 2012 i wiedzieć, jak tworzyć projekty/rozwiązania.

Konfigurowanie bazy danych SQL Database

  1. Aby wystąpienia usługi przepływu pracy zostały utrwalone, musisz mieć zainstalowany program Microsoft SQL Server i skonfigurować bazę danych do przechowywania utrwalonego wystąpienia przepływu pracy. Uruchom program Microsoft SQL Management Studio, klikając przycisk Start , wybierając pozycję Wszystkie programy, Microsoft SQL Server 2008 i Microsoft SQL Management Studio.

  2. Kliknij przycisk Połącz, aby zalogować się do wystąpienia programu SQL Server

  3. Kliknij prawym przyciskiem myszy pozycję Bazy danych w widoku drzewa i wybierz pozycję Nowa baza danych , aby utworzyć nową bazę danych o nazwie SQLPersistenceStore.

  4. Uruchom plik skryptu SqlWorkflowInstanceStoreSchema.sql znajdujący się w katalogu C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en w bazie danych SQLPersistenceStore, aby skonfigurować wymagane schematy bazy danych.

  5. Uruchom plik skryptu SqlWorkflowInstanceStoreLogic.sql znajdujący się w katalogu C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en w bazie danych SQLPersistenceStore, aby skonfigurować wymaganą logikę bazy danych.

Tworzenie usługi internetowego hostowanego przepływu pracy

  1. Utwórz puste rozwiązanie programu Visual Studio 2012, nadaj mu OrderProcessingnazwę .

  2. Dodaj nowy projekt aplikacji usługi przepływu pracy WCF o nazwie OrderService do rozwiązania.

  3. W oknie dialogowym właściwości projektu wybierz kartę Sieć Web .

    1. W obszarze Akcja początkowa wybierz pozycję Określona strona i określ wartość Service1.xamlx.

      Właściwości sieci Web projektu usługi przepływu pracy

    2. W obszarze Serwery wybierz pozycję Użyj lokalnego serwera sieci Web usług IIS.

      Ustawienia lokalnego serwera sieci Web

      Ostrzeżenie

      Aby ustawić to ustawienie, należy uruchomić program Visual Studio 2012 w trybie administratora.

      Te dwa kroki umożliwiają skonfigurowanie projektu usługi przepływu pracy do hostowania przez usługi IIS.

  4. Otwórz Service1.xamlx plik, jeśli nie został jeszcze otwarty i usuń istniejące działania ReceiveRequest i SendResponse .

  5. Wybierz działanie Usługi sekwencyjnej, a następnie kliknij link Zmienne i dodaj zmienne pokazane na poniższej ilustracji. Spowoduje to dodanie pewnych zmiennych, które będą używane później w usłudze przepływu pracy.

    Uwaga

    Jeśli pozycja CorrelationHandle nie znajduje się na liście rozwijanej Typ zmiennej, wybierz pozycję Przeglądaj dla typów z listy rozwijanej. Wpisz CorrelationHandle w polu Nazwa typu , wybierz pozycję CorrelationHandle w polu listy i kliknij przycisk OK.

    Dodawanie zmiennych

  6. Przeciągnij i upuść szablon działania ReceiveAndSendReply do działania Usługi sekwencyjnej. Ten zestaw działań otrzyma wiadomość od klienta i wyśle odpowiedź z powrotem.

    1. Wybierz działanie Odbierz i ustaw właściwości wyróżnione na poniższej ilustracji.

      Ustawianie właściwości działania odbierania

      Właściwość DisplayName ustawia nazwę wyświetlaną dla działania Odbierz w projektancie. Właściwości ServiceContractName i OperationName określają nazwę kontraktu usługi i operacji implementowanej przez działanie Odbierz. Aby uzyskać więcej informacji o sposobie używania kontraktów w usługach przepływu pracy, zobacz Using Contracts in Workflow (Używanie kontraktów w przepływie pracy).

    2. Kliknij link Definiuj w działaniu ReceiveStartOrder i ustaw właściwości pokazane na poniższej ilustracji. Zwróć uwagę, że wybrano przycisk radiowy Parametry , parametr o nazwie p_customerName jest powiązany ze zmienną customerName . Spowoduje to skonfigurowanie działania Odbieranie w celu odbierania niektórych danych i powiązania tych danych ze zmiennymi lokalnymi.

      Ustawianie danych odebranych przez działanie Odbieranie

    3. Wybierz działanie SendReplyToReceive i ustaw wyróżnioną właściwość pokazaną na poniższej ilustracji.

      Ustawianie właściwości działania SendReply

    4. Kliknij link Definiuj w działaniu SendReplyToStartOrder i ustaw właściwości pokazane na poniższej ilustracji. Zwróć uwagę, że wybrano przycisk radiowy Parametry ; parametr o nazwie p_orderId jest powiązany ze zmienną orderId . To ustawienie określa, że działanie SendReplyToStartOrder zwróci wartość ciągu typu do obiektu wywołującego.

      Konfigurowanie danych zawartości działania SendReply

    5. Przeciągnij i upuść działanie Assign między działaniami Receive i SendReply i ustaw właściwości, jak pokazano na poniższej ilustracji:

      Dodawanie działania przypisywania

      Spowoduje to utworzenie nowego identyfikatora zamówienia i umieszczenie wartości w zmiennej orderId.

    6. Wybierz działanie ReplyToStartOrder. W oknie właściwości kliknij przycisk wielokropka dla pozycji CorrelationInitializers. Wybierz link Dodaj inicjator, wprowadź w orderIdHandle polu tekstowym Inicjator, wybierz pozycję Inicjator korelacji zapytań dla typu korelacji, a następnie wybierz pozycję p_orderId w polu listy rozwijanej Zapytania XPATH. Te ustawienia zostały pokazane na poniższej ilustracji. Kliknij przycisk OK. Spowoduje to zainicjowanie korelacji między klientem a tym wystąpieniem usługi przepływu pracy. Po odebraniu komunikatu zawierającego ten identyfikator zamówienia jest kierowany do tego wystąpienia usługi przepływu pracy.

      Dodawanie inicjatora korelacji

  7. Przeciągnij i upuść kolejne działanie ReceiveAndSendReply na końcu przepływu pracy (poza sekwencją zawierającą pierwsze działania Receive i SendReply ). Otrzyma on drugą wiadomość wysłaną przez klienta i odpowie na nie.

    1. Wybierz sekwencję zawierającą nowo dodane działania Receive i SendReply, a następnie kliknij przycisk Zmienne. Dodaj zmienną wyróżnioną na poniższej ilustracji:

      Dodawanie nowych zmiennych

      orderResult Dodaj również jako ciąg w Sequence zakresie.

    2. Wybierz działanie Odbierz i ustaw właściwości pokazane na poniższej ilustracji:

      Ustawianie właściwości działania Odbieranie

      Uwaga

      Nie zapomnij zmienić pola ServiceContractName na ../IAddItem.

    3. Kliknij link Definiuj w działaniu ReceiveAddItem i dodaj parametry pokazane na poniższej ilustracji: Spowoduje to skonfigurowanie działania odbierania w celu zaakceptowania dwóch parametrów, identyfikatora zamówienia i identyfikatora uporządkowanego elementu.

      Określanie parametrów dla drugiego odbioru

    4. Kliknij przycisk wielokropka Koreluj i wprowadź polecenie orderIdHandle. W obszarze Zapytania XPath kliknij strzałkę listy rozwijanej i wybierz pozycję p_orderId. Spowoduje to skonfigurowanie korelacji dla drugiego działania odbierania. Aby uzyskać więcej informacji na temat korelacji, zobacz Korelacja.

      Ustawianie właściwości CorrelatesOn

    5. Przeciągnij i upuść działanie If bezpośrednio po działaniu ReceiveAddItem . To działanie działa podobnie jak instrukcja if.

      1. Ustaw właściwość Condition naitemId=="Zune HD" (itemId="Zune HD" for Visual Basic)

      2. Przeciągnij i upuść działanie Assign w sekcji Then (Następnie ), a inne do sekcji Else ustaw właściwości działań Przypisywanie , jak pokazano na poniższej ilustracji.

        Przypisywanie wyniku wywołania usługi

        Jeśli warunek to true sekcja Then zostanie wykonana. Jeśli warunek to sekcja Else jest false wykonywana.

      3. Wybierz działanie SendReplyToReceive i ustaw właściwość DisplayName pokazaną na poniższej ilustracji.

        Ustawianie właściwości działania SendReply

      4. Kliknij link Definiuj w działaniu SetReplyToAddItem i skonfiguruj go, jak pokazano na poniższej ilustracji. Spowoduje to skonfigurowanie działania SendReplyToAddItem w celu zwrócenia wartości w zmiennej orderResult .

        Ustawianie powiązania danych dla działania SendReply

  8. Otwórz plik web.config i dodaj następujące elementy w <sekcji zachowania> , aby włączyć trwałość przepływu pracy. (Pamiętaj, aby ukończyć parametry połączenia).

    <sqlWorkflowInstanceStore connectionString="...;Asynchronous Processing=True" instanceEncodingOption="None" instanceCompletionAction="DeleteAll" instanceLockedExceptionAction="BasicRetry" hostLockRenewalPeriod="00:00:30" runnableInstancesDetectionPeriod="00:00:02" />
              <workflowIdle timeToUnload="0"/>
    
  9. Stwórz rozwiązanie.

Tworzenie aplikacji klienckiej w celu wywołania usługi przepływu pracy

  1. Dodaj nowy projekt aplikacji konsolowej o nazwie OrderClient do rozwiązania.

  2. Dodawanie odwołań do następujących zestawów do OrderClient projektu

    1. System.ServiceModel.dll

    2. System.ServiceModel.Activities.dll

  3. Dodaj odwołanie do usługi przepływu pracy i określ OrderService jako przestrzeń nazw.

  4. W metodzie Main() projektu klienta dodaj następujący 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. Skompiluj rozwiązanie i uruchom aplikację OrderClient . Klient wyświetli następujący tekst:

    Sending start messageWorkflow service is idle...Press [ENTER] to send an add item message to reactivate the workflow service...
    
  6. Aby sprawdzić, czy usługa przepływu pracy została utrwalone, uruchom program SQL Server Management Studio, przechodząc do menu Start , Wybierając pozycję Wszystkie programy, Microsoft SQL Server 2008, SQL Server Management Studio.

    1. W okienku po lewej stronie rozwiń pozycję Bazy danych, SQLPersistenceStore, Widoki i kliknij prawym przyciskiem myszy pozycję System.Activities.DurableInstancing.Instances, a następnie wybierz pozycję Wybierz 1000 pierwszych wierszy. W okienku Wyniki sprawdź, czy na liście jest widoczne co najmniej jedno wystąpienie. W przypadku wystąpienia wyjątku podczas uruchamiania mogą istnieć inne wystąpienia z poprzednich przebiegów. Istniejące wiersze można usunąć, klikając prawym przyciskiem myszy pozycję System.Activities.DurableInstancing.Instances i wybierając polecenie Edytuj pierwsze 200 wierszy, naciskając przycisk Wykonaj, wybierając wszystkie wiersze w okienku wyników i wybierając polecenie Usuń. Aby sprawdzić, czy wystąpienie wyświetlane w bazie danych to wystąpienie utworzone przez aplikację, sprawdź, czy widok wystąpień jest pusty przed uruchomieniem klienta. Po ponownym uruchomieniu zapytania przez klienta (wybierz 1000 pierwszych wierszy) i sprawdzeniu, czy dodano nowe wystąpienie.
  7. Naciśnij Enter, aby wysłać komunikat dodawania elementu do usługi przepływu pracy. Klient wyświetli następujący tekst:

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

Zobacz też