Criar um serviço de fluxo de trabalho de execução prolongada
Este artigo descreve como criar um serviço de fluxo de trabalho de longa duração, que pode ser executado por longos períodos. Em algum momento, o fluxo de trabalho pode ficar ocioso aguardando informações adicionais. Quando isso ocorre, o fluxo de trabalho é persistido em um banco de dados SQL e é removido da memória. Quando as informações adicionais ficam disponíveis, a instância de fluxo de trabalho é carregada novamente na memória e continua em execução.
Nesse cenário, você está implementando um sistema de ordenação simplificado. O cliente envia uma mensagem inicial para o serviço de fluxo de trabalho para iniciar a ordem. Ele retorna uma ID de ordem para o cliente. Neste ponto, o serviço de fluxo de trabalho está aguardando outra mensagem do cliente e entra no estado ocioso e é persistido em um banco de dados SQL Server. Quando o cliente envia a próxima mensagem para solicitar um item, o serviço de fluxo de trabalho é carregado novamente na memória e termina de processar a ordem.
No exemplo de código, ele retorna uma cadeia de caracteres informando que o item foi adicionado à ordem. O exemplo de código não se destina a ser uma aplicação real da tecnologia, mas sim um exemplo simples que ilustra serviços de fluxo de trabalho de execução prolongada.
Pré-requisitos
Você deve ter os softwares a seguir instalados para usar este passo a passo:
- Microsoft SQL Server 2008
- Visual Studio 2012
- Microsoft .NET Framework 4.6.1
Você também deve estar familiarizado com o WCF e o Visual Studio 2012 e saber como criar projetos/soluções.
Defina o Banco de Dados SQL.
Para que as instâncias de serviço de fluxo de trabalho sejam persistidas, você deve ter o Microsoft SQL Server instalado e configurar um banco de dados para armazenar as instâncias de fluxo de trabalho persistentes. Execute o Microsoft SQL Management Studio clicando no botão Iniciar, selecionando Todos os Programas, Microsoft SQL Server 2008 e Microsoft SQL Management Studio.
Clique no botão Conectar para fazer logon na instância do SQL Server
Clique com o botão direito do mouse em Bancos de Dados no modo de exibição de árvore e selecione Novo Banco de Dados para criar um novo banco de dados chamado
SQLPersistenceStore
.Execute o arquivo de script SqlWorkflowInstanceStoreSchema.sql localizado no diretório C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en no banco de dados SQLPersistenceStore para configurar os esquemas de banco de dados necessários.
Execute o arquivo de script SqlWorkflowInstanceStoreLogic.sql localizado no diretório C:\Windows\Microsoft.NET\Framework\v4.0\SQL\en no banco de dados SQLPersistenceStore para configurar a lógica de banco de dados necessária.
Criar o serviço de fluxo de trabalho hospedado na Web
Crie uma solução vazia do Visual Studio 2012, nomeie-a como
OrderProcessing
.Adicione um novo projeto de Aplicativo de Serviço de Fluxo de Trabalho do WCF chamado
OrderService
à solução.No diálogo de propriedades dos projetos, selecione a guia Web.
Em Iniciar ação, selecione Página específica e especifique
Service1.xamlx
.Em Servidores, selecione Usar servidor Web IIS local.
Aviso
Você deve executar o Visual Studio 2012 no modo de administrador para fazer essa configuração.
Essas duas etapas configuram o projeto de serviço de fluxo de trabalho a ser hospedado pelo IIS.
Abra
Service1.xamlx
se ainda não estiver aberto e exclua as atividades ReceiveRequest e SendResponse existentes.Selecione a atividade Serviço Sequencial e clique no link Variáveis e adicione as variáveis mostradas na ilustração a seguir. Isso adiciona algumas variáveis que serão usadas posteriormente no serviço de fluxo de trabalho.
Observação
Se CorrelationHandle não estiver na lista suspensa Tipo de Variável, selecione Procurar tipos na lista suspensa. Digite CorrelationHandle na caixa Nome do tipo , selecione CorrelationHandle na caixa de listagem e clique em OK.
Arraste e solte um modelo de atividade ReceiveAndSendReply na atividade Serviço Sequencial . Esse conjunto de atividades receberá uma mensagem de um cliente e enviará uma resposta de volta.
Selecione a atividade Receive e defina as propriedades realçadas na ilustração a seguir.
A propriedade DisplayName define o nome exibido para a atividade Receive no designer. As propriedades ServiceContractName e OperationName especificam o nome do contrato de serviço e da operação implementados pela atividade Receive. Para obter mais informações sobre como os contratos são usados nos serviços de fluxo de trabalho, confira Usando contratos no fluxo de trabalho.
Clique no link Definir na atividade ReceiveStartOrder e defina as propriedades mostradas na ilustração a seguir. Observe que o botão de opção Parâmetros está selecionado, um parâmetro chamado
p_customerName
está associado à variávelcustomerName
. Isso configura a atividade Receive para receber alguns dados e associar esses dados a variáveis locais.Selecione a atividade SendReplyToReceive e defina a propriedade realçada mostrada na ilustração a seguir.
Clique no link Definir na atividade SendReplyToStartOrder e defina as propriedades mostradas na ilustração a seguir. Observe que o botão de opção Parâmetros está selecionado; um parâmetro chamado
p_orderId
está associado à variávelorderId
. Essa configuração especifica que a atividade SendReplyToStartOrder retornará um valor do tipo cadeia de caracteres para o chamador.Arraste e solte uma atividade Assign entre as atividades Receive e SendReply e defina as propriedades conforme mostrado na ilustração a seguir:
Isso cria uma nova ID de ordem e coloca o valor na variável orderId.
Selecione a atividade ReplyToStartOrder . Na janela Propriedades, clique no botão de reticências para CorrelationInitializers. Selecione o link Adicionar inicializador , insira
orderIdHandle
na caixa de texto Inicializador, selecione Inicializador de correlação de consulta para o tipo correlação e selecione p_orderId na caixa suspensa Consultas XPATH. Essas configurações são mostradas na ilustração a seguir. Clique em OK. Isso inicializa uma correlação entre o cliente e essa instância do serviço de fluxo de trabalho. Quando uma mensagem que contém essa ID de ordem é recebida, ela é roteada para essa instância do serviço de fluxo de trabalho.
Arraste e solte outra atividade ReceiveAndSendReply até o final do fluxo de trabalho (fora da Sequência que contém as primeiras atividades Receive e SendReply). Isso receberá a segunda mensagem enviada pelo cliente e responderá a ela.
Selecione a Sequência que contém as atividades Receive e SendReply recém-adicionadas e clique no botão Variáveis . Adicione a variável realçada na ilustração a seguir:
Adicione também
orderResult
como Cadeia de caracteres no escopoSequence
.Selecione a atividade Receive e defina as propriedades mostradas na ilustração a seguir:
Observação
Não se esqueça de alterar o campo ServiceContractName com
../IAddItem
.Clique no link Definir na atividade ReceiveAddItem e adicione os parâmetros mostrados na ilustração a seguir: Isso configura a atividade de recebimento para aceitar dois parâmetros, a ID da ordem e a ID do item que está sendo ordenado.
Clique no botão de reticências CorrelateOn e insira
orderIdHandle
. Em Consultas XPath, clique na seta suspensa e selecionep_orderId
. Isso configura a correlação na segunda atividade de recebimento. Para obter mais informações sobre correlação, confira Correlation.Arraste e solte uma atividade If imediatamente após a atividade ReceiveAddItem . Essa atividade atua como uma instrução if.
Defina a propriedade Condition como
itemId=="Zune HD" (itemId="Zune HD" for Visual Basic)
Arraste e solte uma atividade Assign na seção Then e outra na seção Else defina as propriedades das atividades Assign, conforme mostrado na ilustração a seguir.
Se a condição for
true
, a seção Then será executada. Se a condição forfalse
, a seção Else será executada.Selecione a atividade SendReplyToReceive e defina a propriedade DisplayName mostrada na ilustração a seguir.
Clique no link Definir na atividade SetReplyToAddItem e configure-o conforme mostrado na ilustração a seguir. Isso configura a atividade SendReplyToAddItem para retornar o valor na variável
orderResult
.
Abra o arquivo web.config e adicione os seguintes elementos na seção de <comportamento> para habilitar a persistência do fluxo de trabalho. (Conclua a cadeia de conexão.)
<sqlWorkflowInstanceStore connectionString="...;Asynchronous Processing=True" instanceEncodingOption="None" instanceCompletionAction="DeleteAll" instanceLockedExceptionAction="BasicRetry" hostLockRenewalPeriod="00:00:30" runnableInstancesDetectionPeriod="00:00:02" /> <workflowIdle timeToUnload="0"/>
Compile a solução.
Crie um aplicativo cliente para chamar o serviço de fluxo de trabalho
Adicione um novo projeto de aplicativo de console chamado
OrderClient
à solução.Adicione referências aos assemblies a seguir do projeto
OrderClient
System.ServiceModel.dll
System.ServiceModel.Activities.dll
Adicione uma referência de serviço ao serviço de fluxo de trabalho e especifique
OrderService
como o namespace.No método
Main()
do projeto cliente, adicione o seguinte código: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); }
Crie a solução e execute o aplicativo
OrderClient
. O cliente exibirá o seguinte texto:Sending start messageWorkflow service is idle...Press [ENTER] to send an add item message to reactivate the workflow service...
Para verificar se o serviço de fluxo de trabalho foi persistente, inicie o SQL Server Management Studio acessando o menu Iniciar, Selecionando Todos os Programas, Microsoft SQL Server 2008, SQL Server Management Studio.
- No painel esquerdo, expanda Bancos de Dados, SQLPersistenceStore, Exibições, clique com o botão direito do mouse em System.Activities.DurableInstancing.Instances e selecione Selecionar As 1000 Principais Linhas. No painel Resultados, verifique se você vê pelo menos uma instância listada. Pode haver outras instâncias de execuções anteriores se ocorreu uma exceção durante a execução. Você pode excluir linhas existentes clicando com o botão direito do mouse em System.Activities.DurableInstancing.Instances e selecionando Editar as 200 linhas principais, pressionando o botão Executar, selecionando todas as linhas no painel de resultados e selecionando Excluir. Para verificar se a instância exibida no banco de dados é a instância criada pelo aplicativo, verifique se a exibição de instâncias está vazia antes de executar o cliente. Depois que o cliente estiver executando novamente a consulta (Selecione 1000 linhas principais) e verifique se uma nova instância foi adicionada.
Pressione Enter para enviar a mensagem adicionar item ao serviço de fluxo de trabalho. O cliente exibirá o seguinte texto:
Sending add item messageService returned: Item added to orderPress any key to continue . . .