Criar um serviço de fluxo de trabalho de longa execução
Este artigo descreve como criar um serviço de fluxo de trabalho de longa execução, que pode ser executado por longos períodos de tempo. 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 do fluxo de trabalho é carregada de volta na memória e continua em execução.
Nesse cenário, você está implementando um sistema de pedidos simplificado. O cliente envia uma mensagem inicial para o serviço de fluxo de trabalho para iniciar o pedido. Ele retorna um ID de pedido 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 do SQL Server. Quando o cliente envia a próxima mensagem para solicitar um item, o serviço de fluxo de trabalho é carregado de volta na memória e conclui o processamento do pedido.
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 do mundo real da tecnologia, mas sim um exemplo simples que ilustra serviços de fluxo de trabalho de longa execução.
Pré-requisitos
Você deve ter o seguinte software instalado para usar este passo a passo:
- Microsoft SQL Server 2008
- 2012 Visual Studio
- Microsoft .NET Framework 4.6.1
Você também deve estar familiarizado com WCF e Visual Studio 2012 e saber como criar projetos/soluções.
Configurar a Base de Dados SQL
Para que as instâncias de serviço de fluxo de trabalho sejam persistentes, 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 na visualização em á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
OrderProcessing
.Adicione um novo projeto WCF Workflow Service Application chamado
OrderService
à solução.Na caixa de diálogo de propriedades do projeto, 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, 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.
Nota
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. Este conjunto de atividades receberá uma mensagem de um cliente e enviará uma resposta de volta.
Selecione a atividade Receber 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 que são implementados pela atividade Receive. Para obter mais informações sobre como os contratos são usados nos serviços de fluxo de trabalho, consulte 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á vinculado àcustomerName
variável. Isso configura a atividade Receber para receber alguns dados e vincular 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á vinculado àorderId
variável. Essa configuração especifica que a atividade SendReplyToStartOrder retornará um valor do tipo string para o chamador.Arraste e solte uma atividade Atribuir entre as atividades Receive e SendReply e defina as propriedades conforme mostrado na ilustração a seguir:
Isso cria um novo ID de ordem e coloca o valor na variável orderId.
Selecione a atividade ReplyToStartOrder . Na janela de propriedades, clique no botão de reticências para CorrelationInitializers. Selecione o link Adicionar inicializador , digite
orderIdHandle
na caixa de texto Inicializador, selecione Inicializador de correlação de consulta para o tipo de correlação e selecione p_orderId na caixa suspensa Consultas XPATH. Estas definições são apresentadas na ilustração seguinte. Clique em OK. Isso inicializa uma correlação entre o cliente e esta instância do serviço de fluxo de trabalho. Quando uma mensagem contendo essa ID de ordem é recebida, ela é roteada para esta 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 ). Este 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 String noSequence
escopo.Selecione a atividade Receber e defina as propriedades mostradas na ilustração a seguir:
Nota
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, o ID do pedido e o ID do item que está sendo pedido.
Clique no botão de reticências CorrelateOn e digite
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, consulte Correlação.Arraste e solte uma atividade If imediatamente após a atividade ReceiveAddItem. Esta atividade funciona como uma declaração if.
Defina a propriedade Condition como
itemId=="Zune HD" (itemId="Zune HD" for Visual Basic)
Arraste e solte uma atividade Atribuir na seção Então e outra na seção Senão defina as propriedades das atividades Atribuir 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
orderResult
variável.
Abra o arquivo web.config e adicione os seguintes elementos na seção de comportamento> para habilitar a persistência do <fluxo de trabalho. (Certifique-se de concluir 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.
Criar um aplicativo cliente para chamar o serviço de fluxo de trabalho
Adicione um novo projeto de aplicativo de console chamado
OrderClient
à solução.Adicionar referências aos seguintes assemblies ao
OrderClient
projetoSystem.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.Main()
No método 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
OrderClient
aplicativo. 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 indo para o menu Iniciar , Selecionando Todos os Programas, Microsoft SQL Server 2008, SQL Server Management Studio.
- No painel esquerdo, expanda, Databases, SQLPersistenceStore, Views e clique com o botão direito do mouse em System.Activities.DurableInstancing.Instances e selecione Select Top 1000 Rows. No painel Resultados, verifique se você vê pelo menos uma instância listada. Pode haver outras instâncias de execuções anteriores se uma exceção ocorreu 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 principais linhas, 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. Quando o cliente estiver em execução, execute novamente a consulta (Selecionar as 1000 principais linhas) 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 . . .