Compartilhar via


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:

  1. Microsoft SQL Server 2008
  2. Visual Studio 2012
  3. 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.

  1. 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.

  2. Clique no botão Conectar para fazer logon na instância do SQL Server

  3. 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.

  4. 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.

  5. 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

  1. Crie uma solução vazia do Visual Studio 2012, nomeie-a como OrderProcessing.

  2. Adicione um novo projeto de Aplicativo de Serviço de Fluxo de Trabalho do WCF chamado OrderService à solução.

  3. No diálogo de propriedades dos projetos, selecione a guia Web.

    1. Em Iniciar ação, selecione Página específica e especifique Service1.xamlx.

      Propriedades da Web do Projeto de Serviço de Fluxo de Trabalho

    2. Em Servidores, selecione Usar servidor Web IIS local.

      Configurações do Servidor Web 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.

  4. Abra Service1.xamlx se ainda não estiver aberto e exclua as atividades ReceiveRequest e SendResponse existentes.

  5. 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.

    Adicionar variáveis

  6. 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.

    1. Selecione a atividade Receive e defina as propriedades realçadas na ilustração a seguir.

      Definir propriedades da atividade de recebimento

      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.

    2. 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ável customerName. Isso configura a atividade Receive para receber alguns dados e associar esses dados a variáveis locais.

      Definindo os dados recebidos pela atividade Receive

    3. Selecione a atividade SendReplyToReceive e defina a propriedade realçada mostrada na ilustração a seguir.

      Definindo as propriedades da atividade SendReply

    4. 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ável orderId. Essa configuração especifica que a atividade SendReplyToStartOrder retornará um valor do tipo cadeia de caracteres para o chamador.

      Configurando os dados de conteúdo da atividade SendReply

    5. Arraste e solte uma atividade Assign entre as atividades Receive e SendReply e defina as propriedades conforme mostrado na ilustração a seguir:

      Adicionando uma atividade de atribuição

      Isso cria uma nova ID de ordem e coloca o valor na variável orderId.

    6. 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.

      Adicionando um inicializador de correlação

  7. 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.

    1. 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:

      Adicionando novas variáveis

      Adicione também orderResult como Cadeia de caracteres no escopo Sequence.

    2. Selecione a atividade Receive e defina as propriedades mostradas na ilustração a seguir:

      Defina as propriedades da atividade Receive

      Observação

      Não se esqueça de alterar o campo ServiceContractName com ../IAddItem.

    3. 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.

      Especificando parâmetros para o segundo recebimento

    4. Clique no botão de reticências CorrelateOn e insira orderIdHandle. Em Consultas XPath, clique na seta suspensa e selecione p_orderId. Isso configura a correlação na segunda atividade de recebimento. Para obter mais informações sobre correlação, confira Correlation.

      Definindo a propriedade CorrelatesOn

    5. Arraste e solte uma atividade If imediatamente após a atividade ReceiveAddItem . Essa atividade atua como uma instrução if.

      1. Defina a propriedade Condition como itemId=="Zune HD" (itemId="Zune HD" for Visual Basic)

      2. 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.

        Atribuir o resultado da chamada de serviço

        Se a condição for true, a seção Then será executada. Se a condição for false, a seção Else será executada.

      3. Selecione a atividade SendReplyToReceive e defina a propriedade DisplayName mostrada na ilustração a seguir.

        Definindo as propriedades de atividade SendReply

      4. 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.

        Definindo a associação de dados para a propriedade SendReply activity

  8. 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"/>
    
  9. Compile a solução.

Crie um aplicativo cliente para chamar o serviço de fluxo de trabalho

  1. Adicione um novo projeto de aplicativo de console chamado OrderClient à solução.

  2. Adicione referências aos assemblies a seguir do projeto OrderClient

    1. System.ServiceModel.dll

    2. System.ServiceModel.Activities.dll

  3. Adicione uma referência de serviço ao serviço de fluxo de trabalho e especifique OrderService como o namespace.

  4. 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);
    }
    
  5. 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...
    
  6. 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.

    1. 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.
  7. 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 . . .
    

Confira também