Vytvoření dlouhotrvající služby pracovního postupu
Tento článek popisuje, jak vytvořit dlouho běžící službu pracovního postupu, která může běžet po dlouhou dobu. V určitém okamžiku může pracovní postup nečinně čekat na další informace. Pokud k tomu dojde, pracovní postup se zachová v databázi SQL a odebere se z paměti. Jakmile budou k dispozici další informace, instance pracovního postupu se načte zpět do paměti a bude pokračovat v provádění.
V tomto scénáři implementujete zjednodušený systém řazení. Klient odešle počáteční zprávu službě pracovního postupu, aby spustil objednávku. Klientovi vrátí ID objednávky. V tuto chvíli služba pracovního postupu čeká na další zprávu z klienta a přejde do stavu nečinnosti a zůstane zachována v databázi SQL Serveru. Když klient odešle další zprávu k objednání položky, služba pracovního postupu se načte zpět do paměti a dokončí zpracování objednávky.
V ukázce kódu vrátí řetězec, který uvádí, že položka byla přidána do pořadí. Ukázka kódu není určená jako skutečná aplikace technologie, ale spíše jednoduchá ukázka, která ilustruje dlouhotrvající služby pracovních postupů.
Požadavky
Abyste mohli tento návod použít, musíte mít nainstalovaný následující software:
- Microsoft SQL Server 2008
- Visual Studio 2012
- Microsoft .NET Framework 4.6.1
Musíte být také obeznámeni s WCF a sadou Visual Studio 2012 a vědět, jak vytvářet projekty a řešení.
Nastavení služby SQL Database
Aby instance služby pracovního postupu zůstaly trvalé, musíte mít nainstalovaný Microsoft SQL Server a musíte nakonfigurovat databázi pro uložení trvalých instancí pracovního postupu. Spusťte Aplikaci Microsoft SQL Management Studio kliknutím na tlačítko Start , výběrem možnosti Všechny programy, Microsoft SQL Server 2008 a Microsoft SQL Management Studio.
Kliknutím na tlačítko Připojit se přihlaste k instanci SQL Serveru.
Klikněte pravým tlačítkem na Databáze ve stromovém zobrazení a výběrem možnosti Nová databáze vytvořte novou databázi s názvem
SQLPersistenceStore
.Spusťte soubor skriptu SqlWorkflowInstanceStoreSchema.sql umístěný v adresáři C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en v databázi SQLPersistenceStore a nastavte potřebná schémata databáze.
Spusťte soubor skriptu SqlWorkflowInstanceStoreLogic.sql umístěný v adresáři C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en v databázi SQLPersistenceStore pro nastavení potřebné databázové logiky.
Vytvoření služby pracovního postupu hostovaného na webu
Vytvořte prázdné řešení sady Visual Studio 2012, pojmenujte ho
OrderProcessing
.Přidejte do řešení nový projekt
OrderService
aplikace služby pracovního postupu WCF.V dialogovém okně vlastností projektu vyberte kartu Web .
V části Zahájit akci vyberte Konkrétní stránku a zadejte
Service1.xamlx
.V části Servery vyberte Použít místní webový server SLUŽBY IIS.
Upozorňující
Chcete-li toto nastavení nastavit, musíte spustit Visual Studio 2012 v režimu správce.
Tyto dva kroky nakonfigurují projekt služby pracovního postupu tak, aby byl hostován službou IIS.
Otevřete
Service1.xamlx
, pokud ještě není otevřená, a odstraňte existující aktivity ReceiveRequest a SendResponse .Vyberte aktivitu sekvenční služby a klikněte na odkaz Proměnné a přidejte proměnné zobrazené na následujícím obrázku. Tím se přidají některé proměnné, které se později použijí ve službě pracovního postupu.
Poznámka:
Pokud CorrelationHandle není v rozevíracím seznamu Typ proměnné, vyberte z rozevíracího seznamu Vyhledat typy . Do pole Název typu zadejte CorrelationHandle, ze seznamu vyberte CorrelationHandle a klikněte na OK.
Přetáhněte šablonu aktivity ReceiveAndSendReply do aktivity sekvenční služby. Tato sada aktivit obdrží zprávu od klienta a pošle odpověď zpět.
Vyberte aktivitu Receive a nastavte vlastnosti zvýrazněné na následujícím obrázku.
Vlastnost DisplayName nastaví název zobrazovaný pro aktivitu Receive v návrháři. Vlastnosti ServiceContractName a OperationName určují název kontraktu služby a operace, které jsou implementovány aktivitou Receive. Další informace o tom, jak se kontrakty používají ve službách pracovních postupů, naleznete v tématu Použití kontraktů v pracovním postupu.
Klikněte na odkaz Definovat v aktivitě ReceiveStartOrder a nastavte vlastnosti zobrazené na následujícím obrázku. Všimněte si, že je vybrán přepínač Parametry , parametr s názvem
p_customerName
je svázán s proměnnoucustomerName
. Tím se nakonfiguruje aktivita Receive tak, aby přijímala nějaká data a svázala tato data s místními proměnnými.Vyberte Aktivitu SendReplyToReceive a nastavte zvýrazněnou vlastnost zobrazenou na následujícím obrázku.
Klikněte na odkaz Define v aktivitě SendReplyToStartOrder a nastavte vlastnosti zobrazené na následujícím obrázku. Všimněte si, že je vybrán přepínač Parametry . Parametr s názvem
p_orderId
je svázán s proměnnouorderId
. Toto nastavení určuje, že aktivita SendReplyToStartOrder vrátí volajícímu hodnotu typu řetězec.Přetáhněte aktivitu Přiřadit mezi aktivitami Receive a SendReply a nastavte vlastnosti, jak je znázorněno na následujícím obrázku:
Tím se vytvoří nové ID objednávky a hodnota se umístí do proměnné orderId.
Vyberte aktivitu ReplyToStartOrder. V okně vlastností klikněte na tlačítko se třemi tečkami pro CorrelationInitializers. Vyberte odkaz Přidat inicializátor, zadejte
orderIdHandle
do textového pole Inicializátor, vyberte Inicializátor korelace dotazu pro typ korelace a vyberte p_orderId v rozevíracím seznamu Dotazy XPATH. Tato nastavení znázorňuje následující obrázek. Klikněte na OK. Tím se inicializuje korelace mezi klientem a touto instancí služby pracovního postupu. Když se přijme zpráva obsahující toto ID objednávky, bude směrována do této instance služby pracovního postupu.
Přetáhněte další aktivitu ReceiveAndSendReply na konec pracovního postupu (mimo posloupnost obsahující první aktivity Receive a SendReply ). Tím se zobrazí druhá zpráva odeslaná klientem a odpoví na ni.
Vyberte sekvenci, která obsahuje nově přidané aktivity Receive a SendReply, a klikněte na tlačítko Proměnné. Přidejte proměnnou zvýrazněnou na následujícím obrázku:
orderResult
Přidejte také jako řetězec vSequence
oboru.Vyberte aktivitu Receive a nastavte vlastnosti zobrazené na následujícím obrázku:
Poznámka:
Nezapomeňte změnit pole ServiceContractName pomocí parametru
../IAddItem
.Klikněte na odkaz Definovat v aktivitě ReceiveAddItem a přidejte parametry uvedené na následujícím obrázku: Tím se konfigurují aktivity příjmu tak, aby přijímaly dva parametry, ID objednávky a ID seřazené položky.
Klikněte na tlačítko Se třemi tečky KorelovatOn a zadejte
orderIdHandle
. V části Dotazy XPath klikněte na šipku rozevíracího seznamu a vybertep_orderId
. Tím se konfiguruje korelace druhé aktivity příjmu. Další informace o korelaci naleznete v tématu Korelace.Přetáhněte aktivitu If ihned po aktivitě ReceiveAddItem. Tato aktivita funguje stejně jako příkaz if.
Nastavení vlastnosti Podmínka na
itemId=="Zune HD" (itemId="Zune HD" for Visual Basic)
Přetáhněte aktivitu Přiřadit do oddílu Pak a další do oddílu Else nastavte vlastnosti aktivity Přiřadit, jak je znázorněno na následujícím obrázku.
Pokud je
true
podmínka sekci Pak se spustí. Pokud jefalse
podmínka oddíl Else proveden.Vyberte aktivitu SendReplyToReceive a nastavte vlastnost DisplayName zobrazenou na následujícím obrázku.
Klikněte na odkaz Define v aktivitě SetReplyToAddItem a nakonfigurujte ho, jak je znázorněno na následujícím obrázku. Tím se nakonfiguruje aktivita SendReplyToAddItem tak, aby vrátila hodnotu v
orderResult
proměnné.
Otevřete soubor web.config a přidejte do části chování> následující prvky<, které umožňují trvalost pracovního postupu. (Nezapomeňte dokončit připojovací řetězec.)
<sqlWorkflowInstanceStore connectionString="...;Asynchronous Processing=True" instanceEncodingOption="None" instanceCompletionAction="DeleteAll" instanceLockedExceptionAction="BasicRetry" hostLockRenewalPeriod="00:00:30" runnableInstancesDetectionPeriod="00:00:02" /> <workflowIdle timeToUnload="0"/>
Sestavte řešení.
Vytvoření klientské aplikace pro volání služby pracovního postupu
Přidejte do řešení nový projekt konzolové aplikace volaný
OrderClient
.Přidejte do projektu odkazy na následující sestavení
OrderClient
.System.ServiceModel.dll
System.ServiceModel.Activities.dll
Přidejte odkaz na službu pracovního postupu a zadejte
OrderService
jako obor názvů.Main()
V metodě klientského projektu přidejte následující kód: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); }
Sestavte řešení a spusťte
OrderClient
aplikaci. Klient zobrazí následující text:Sending start messageWorkflow service is idle...Press [ENTER] to send an add item message to reactivate the workflow service...
Chcete-li ověřit, zda byla služba pracovního postupu zachována, spusťte aplikaci SQL Server Management Studio tak, že přejdete do nabídky Start a vyberete všechny programy, Microsoft SQL Server 2008, SQL Server Management Studio.
- V levém podokně rozbalte databáze, SQLPersistenceStore, Zobrazení a klikněte pravým tlačítkem na System.Activities.DurableInstancing.Instances a vyberte Vybrat prvních 1000 řádků. V podokně Výsledky ověřte, že se zobrazí alespoň jedna uvedená instance. Pokud při spuštění došlo k výjimce, mohou existovat další instance z předchozích spuštění. Existující řádky můžete odstranit tak, že kliknete pravým tlačítkem na System.Activities.DurableInstancing.Instances a vyberete Upravit prvních 200 řádků, stisknete tlačítko Spustit , vyberete všechny řádky v podokně výsledků a vyberete odstranit. Pokud chcete ověřit, že instance zobrazená v databázi je instance, kterou vaše aplikace vytvořila, ověřte, že je zobrazení instancí prázdné před spuštěním klienta. Po opětovném spuštění klienta spusťte dotaz (vyberte prvních 1000 řádků) a ověřte, že byla přidána nová instance.
Stisknutím klávesy Enter odešlete zprávu o přidání položky do služby pracovního postupu. Klient zobrazí následující text:
Sending add item messageService returned: Item added to orderPress any key to continue . . .