Partilhar via


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:

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

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

  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 na visualização em á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 OrderProcessing.

  2. Adicione um novo projeto WCF Workflow Service Application chamado OrderService à solução.

  3. Na caixa de diálogo de propriedades do projeto, selecione a guia Web .

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

      Propriedades Web do Projeto do 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, 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.

    Adicionar variáveis

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

    1. Selecione a atividade Receber 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 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.

    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á vinculado à customerName variável. Isso configura a atividade Receber para receber alguns dados e vincular esses dados a variáveis locais.

      Definindo os dados recebidos pela atividade Receber

    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á vinculado à orderId variável. Essa configuração especifica que a atividade SendReplyToStartOrder retornará um valor do tipo string para o chamador.

      Configurando os dados de conteúdo da atividade SendReply

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

      Adicionar uma atividade de atribuição

      Isso cria um novo ID de ordem e coloca o valor na variável orderId.

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

      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 ). Este 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 String no Sequence escopo.

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

      Definir as propriedades da atividade de recebimento

      Nota

      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, o ID do pedido e o ID do item que está sendo pedido.

      Especificando parâmetros para o segundo recebimento

    4. Clique no botão de reticências CorrelateOn e digite 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, consulte Correlação.

      Definindo a propriedade CorrelatesOn

    5. Arraste e solte uma atividade If imediatamente após a atividade ReceiveAddItem. Esta atividade funciona como uma declaração if.

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

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

        Atribuindo 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 da 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 orderResult variável.

        Definindo a vinculação de dados para a atividade SendReply

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

Criar 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. Adicionar referências aos seguintes assemblies ao OrderClient projeto

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

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

Consulte também