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:
- Microsoft SQL Server 2008
- Visual Studio 2012
- 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
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.
Kliknij przycisk Połącz, aby zalogować się do wystąpienia programu SQL Server
Kliknij prawym przyciskiem myszy pozycję Bazy danych w widoku drzewa i wybierz pozycję Nowa baza danych , aby utworzyć nową bazę danych o nazwie
SQLPersistenceStore
.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.
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
Utwórz puste rozwiązanie programu Visual Studio 2012, nadaj mu
OrderProcessing
nazwę .Dodaj nowy projekt aplikacji usługi przepływu pracy WCF o nazwie
OrderService
do rozwiązania.W oknie dialogowym właściwości projektu wybierz kartę Sieć Web .
W obszarze Akcja początkowa wybierz pozycję Określona strona i określ wartość
Service1.xamlx
.W obszarze Serwery wybierz pozycję Użyj lokalnego serwera sieci Web usług IIS.
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.
Otwórz
Service1.xamlx
plik, jeśli nie został jeszcze otwarty i usuń istniejące działania ReceiveRequest i SendResponse .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.
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.
Wybierz działanie Odbierz i ustaw właściwości wyróżnione na poniższej ilustracji.
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).
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.Wybierz działanie SendReplyToReceive i ustaw wyróżnioną właściwość pokazaną na poniższej ilustracji.
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.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:
Spowoduje to utworzenie nowego identyfikatora zamówienia i umieszczenie wartości w zmiennej orderId.
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.
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.
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:
orderResult
Dodaj również jako ciąg wSequence
zakresie.Wybierz działanie Odbierz i ustaw właściwości pokazane na poniższej ilustracji:
Uwaga
Nie zapomnij zmienić pola ServiceContractName na
../IAddItem
.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.
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.Przeciągnij i upuść działanie If bezpośrednio po działaniu ReceiveAddItem . To działanie działa podobnie jak instrukcja if.
Ustaw właściwość Condition na
itemId=="Zune HD" (itemId="Zune HD" for Visual Basic)
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.
Jeśli warunek to
true
sekcja Then zostanie wykonana. Jeśli warunek to sekcja Else jestfalse
wykonywana.Wybierz działanie SendReplyToReceive i ustaw właściwość DisplayName pokazaną na poniższej ilustracji.
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
.
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"/>
Stwórz rozwiązanie.
Tworzenie aplikacji klienckiej w celu wywołania usługi przepływu pracy
Dodaj nowy projekt aplikacji konsolowej o nazwie
OrderClient
do rozwiązania.Dodawanie odwołań do następujących zestawów do
OrderClient
projektuSystem.ServiceModel.dll
System.ServiceModel.Activities.dll
Dodaj odwołanie do usługi przepływu pracy i określ
OrderService
jako przestrzeń nazw.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); }
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...
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.
- 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.
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 . . .