Compartilhar via


Padrão de fluxo de trabalho pai-filho usando duplex durável

Uma abordagem comum de projeto para implementar um fluxo de trabalho para um processo complexo, de longa duração, é identificar as partes da lógica de negócios que possam ser isoladas em fluxos de trabalho menores, mais simples e reutilizáveis, e coordenar sua execução a partir do fluxo de trabalho principal. Por exemplo, para o processamento de ordens de compra, é possível optar por definir a lógica de remessas como um fluxo de trabalho (filho) que, por sua vez, é chamado pelo fluxo de trabalho principal da ordem de compra (pai) quando necessário.

No Windows Workflow Foundation do .NET Framework 4, não existem recursos internos para "chamar" um fluxo de trabalho de longa duração a partir de outro. No entanto, há uma série de opções de implementação que permitem ao desenvolvedor configurar manualmente esse comportamento. Discutir todas as opções disponíveis não está no escopo desse exemplo. Em vez disso, nos concentraremos em uma das abordagens mais comuns e genéricas de implementação do padrão "Chamar fluxo de trabalho" - o duplex durável, e especificamente no contexto de serviços de fluxo trabalho WCF de longa duração (fluxos de trabalho XAMLX). O conceito por trás do padrão duplex durável é simples - o pai faz uma chamada para um ponto de extremidade exposto pelo filho, transmitindo um token contextual (usado para correlação) e um endereço de retorno junto com a mensagem de solicitação. Então, depois de algum tempo, quando o filho for concluído, ele fará uma chamada ao pai para que este tome conhecimento da conclusão.

Mais informações sobre configuração de duplex durável manualmente podem ser encontradas no artigo do MSDN em Durable Duplex (https://go.microsoft.com/fwlink/?LinkId=196632), e os exemplos de WF relacionados em Durable Duplex sample (https://go.microsoft.com/fwlink/?LinkId=194430) e How to: Create a Workflow Service That Calls Another Workflow Service.

O principal objetivo deste exemplo é apresentar duas atividades personalizadas com base na interface IActivityTemplateFactory. Ele foi projetado para simplificar a implementação do duplex durável, automatizando o processo de configuração. A atividade Workflow Callable Sequence é usada no fluxo de trabalho filho, em vez de atividades padrão Receber e Enviar geradas após a criação do fluxo de trabalho. A atividade Call Workflow Sequence é usada no fluxo de trabalho pai para gerar as atividades e a respectiva configuração necessária à comunicação com o fluxo de trabalho filho. Essas atividades são reutilizáveis e podem ser adicionadas às caixas de ferramentas do Visual Studio.

O exemplo consiste em duas soluções:

  • A solução (CallWorkflowActivities) contém as duas atividades mencionadas acima. Para permitir que essas atividades sejam usadas no Visual Designer Workflow Studio, basta compilar a solução e adicionar as atividades do conjunto resultante na caixa de ferramentas do Visual Studio.

  • A segunda solução (DurableDuplex_with_CallWorkflowActivities) é uma implementação de exemplo dos fluxos de trabalho pai e filho que se comunicam usando o duplex durável configurado usando as atividades Workflow Callable Sequence e Call Workflow Sequence.

Dica

Os exemplos são fornecidos apenas para fins educacionais. Eles não devem ser usados em um ambiente de produção e não foram testados em um ambiente de produção. A Microsoft não dá suporte técnico para esses exemplos.

Pré-requisitos

Esse aplicativo de exemplo é voltado para os leitores que tiverem os seguintes níveis de experiência ou conhecimento:

  • Conhecimento básico dos Serviços de Informações da Internet (IIS)

  • Conhecimento básico dos aplicativos WCF e Windows Workflow Foundation (WF)

  • Conhecimento básico do Windows PowerShell

  • Conhecimento básico sobre Microsoft SQL Server

Além disso, os recursos de tempo de execução dos Serviços de Hospedagem do Microsoft AppFabric 1.1 para Windows Server devem estar instalados e os seguintes recursos devem estar configurados para executar a solução DurableDuplex_with_CallWorkflowActivities:

  • Repositório de persistência

  • Repositório de monitoramento

Localização do exemplo e arquivos

Solução 1: CallWorkflowActivities

Nome do arquivo Descrição

CallWorkflowActivities.sln

Arquivo de solução da solução CallWorkflowActivities

CallWorkflowActivities

Pasta do projeto

CallWorkflowActivities.csproj

Arquivo de projeto

Properties\AssemblyInfo.cs

Arquivo de informação do assembly

Activities\WorkflowCallableSequence.cs, Activities \CallWorkflowService.cs

Arquivos de origem das duas atividades IActivityTemplateFactory - WorkflowCallableSequence e CallWorkflowService

UI\CallWorkflowConfiguration.xaml, UI\CallWorkflowConfiguration.xaml.cs, UI\WebConfigContent.xaml, UI\WebConfigContent.xaml.cs, UI\WorkflowCallableSequenceConfiguration.xaml, UI\WorkflowCallableSequenceConfiguration.xaml.cs

Arquivos de origem e de projeto da interface do usuário para as caixas de diálogo utilizadas na configuração do duplex durável

Code\Helpers.cs

Código-fonte com as classes de apoio

Images\requiredBang.gif

Arquivo obrigatório da imagem de campo

Solução 2: DurableDuplex_with_CallWorkflowActivities

Nome do arquivo Descrição

DurableDuplex_with_CallWorkflowActivities.sln

Arquivo da solução DurableDuplex_with_CallWorkflowActivities

SampleChildService

Pasta de projeto do serviço de Filho de Exemplo

SampleChildService.csproj

Arquivos de projeto do serviço de Filho de Exemplo

Properties\AssemblyInfo.cs

Arquivo de informação do assembly

ChildWorkflow.xamlx

Definição do fluxo de trabalho do serviço filho (XAMLX)

Web.config

Arquivo de configuração de Web do serviço Filho

SampleParentService

Pasta de projeto do serviço de Pai de Exemplo

SampleParentService.csproj

Arquivos de projeto do serviço de Pai de Exemplo

Properties\AssemblyInfo.cs

Arquivo de informação do assembly

ParentWorkflow.xamlx

Definição do fluxo de trabalho do serviço pai (XAMLX)

Web.config

Arquivo de configuração de Web do serviço Pai

SampleClient

Pasta do cliente de teste

SampleClient.csproj

Arquivo de projeto do cliente de teste

mainForm.cs, mainForm.Designer.cs, mainForm.resx, Program.cs

Arquivos de origem do formulário principal e do aplicativo

Properties\Resources.Designer.cs, Properties\Resources.resx, Properties\Settings.Designer.cs, Properties\Settings.settings

Arquivos e configurações de projeto dos recursos

Properties\AssemblyInfo.cs

Arquivo de informação do assembly

app.config

Arquivo de configurações do aplicativo para o cliente de teste

Configuração desse exemplo

  1. Inicie o Visual Studio 2010 com permissões administrativas.

    Dica

    Essas etapas demonstram como criar e implantar as soluções CallWorkflowActivities e DurableDuplex_with_CallWorkflowActivities com o Visual Studio 2010 e configurar um pool de aplicativos para ser usado com esses serviços.

  2. Abra <samples>\ Samples\Integration\Call Workflow (DurableDuplex)\ CallWorkflowActivities\CallWorkflowActivities.sln, onde <samples> é o caminho em que você instalou os exemplos do AppFabric.

  3. No menu Criar, clique em Criar solução. Verifique se o projeto é criado sem erros na janela de saída.

    Dica

    Agora, o assembly com as atividades WorkflowCallableSequence e CallWorkflowService está compilado e pronto para ser adicionado à barra de ferramentas (consulte os detalhes na seção Executando esse exemplo).

  4. Abra <samples>\ Samples\Integration\Call Workflow (DurableDuplex)\DurableDuplex_with_CallWorkflowActivities\ DurableDuplex_with_CallWorkflowActivities.sln, onde <samples> é o caminho em que você instalou os exemplos do AppFabric.

  5. Quando você receber as instruções para criar os diretórios virtuais dos projetos SampleParentService e SampleChildService, clique em Sim.

  6. No menu Criar, clique em Criar solução. Verifique se os três projetos são criados sem erros na janela de saída.

  7. Iniciar o Gerenciador de Serviços de Informações da Internet (IIS): Clique em Iniciar, em Todos os Programas, em Microsoft AppFabric 1.1 para Windows Server e em Gerenciador dos Serviços de Informações da Internet (IIS).

  8. Expanda o nó do servidor na exibição em árvore à esquerda e depois clique em Pools de aplicativos.

  9. Clique com o botão direito do mouse no pool na lista que executará os exemplos de serviços (você pode usar um dos pools existentes ou criar um novo) e selecione Configurações Avançadas.

  10. Defina a Versão do .NET Framework para v4.0 usando a caixa de seleção suspensa e depois clique em OK.

  11. No painel esquerdo, expanda Sites e expanda Site Padrão.

  12. Localize o aplicativo SampleChildService, clique com o botão direito do mouse e selecione Gerenciar Aplicativo e selecione Configurações Avançadas.

  13. Atualize a propriedade Protocolos habilitados de http para http,net.pipe. Observe que não há espaço após a vírgula. Clique em OK para confirmar as alterações.

  14. Na propriedade Pool de aplicativos, navegue para selecionar o pool de aplicativos que você configurou na etapa 9.

  15. Localize o aplicativo SampleParentService, clique com o botão direito do mouse e selecione Gerenciar Aplicativo e selecione Configurações Avançadas.

  16. Atualize a propriedade Protocolos habilitados de http para http,net.pipe. Observe que não há espaço após a vírgula. Clique em OK para confirmar as alterações.

  17. Na propriedade Pool de aplicativos, navegue para selecionar o pool de aplicativos que você configurou na etapa 9.

    Dica

    As etapas de 13 a 16 acrescentam o protocolo net.pipe aos aplicativos de serviço pai e filho, que são necessários para gerenciar as instâncias de fluxo de trabalho persistentes.

Executando esse exemplo: Opção 1

  1. Inicie o Visual Studio 2010 com permissões administrativas.

    Importante

    Existem duas opções para executar esse exemplo e as etapas para ambas são apresentadas neste tópico. A Opção 1 acompanha a experiência ponta a ponta de usar as atividades WorkflowCallableSequence e CallWorkflowService para chamar um fluxo de trabalho filho a partir de um fluxo de trabalho pai, enquanto que a Opção 2 contempla apenas a solução final: uma implementação do duplex durável pronta para uso, ignorando completamente a experiência de projeto. Para obter mais informações, consulte a seção Demonstração abaixo.

    Dica

    A solução CallWorkflowActivities é projetada para melhorar a experiência de implementação de um duplex durável no momento do projeto. Dessa forma, não há nada a ser "executado". No entanto, essas etapas explicam detalhadamente a utilização das atividades em uma solução simples, na qual um fluxo de trabalho pai chama um fluxo de trabalho filho.

  2. Crie um novo projeto do tipo Aplicativo de Serviço de fluxo de trabalho WCF (este modelo de projeto está localizado nos tipos de projetos de fluxo de trabalho), e atribua ao novo projeto o nome ChildService.

  3. Incluindo as atividades personalizadas do exemplo na caixa de ferramentas: Quando o WF designer for aberto, clique com o botão direito do mouse na caixa de ferramentas, no grupo de atividades Mensagens.

  4. Selecione Escolher Itens e clique na guia Componentes System.Activities.

  5. Clique em Procurar e navegue até <samples>\ Samples\Integration\Call Workflow (DurableDuplex)\ CallWorkflowActivities\ CallWorkflowActivities\bin\Debug. Em seguida, selecione o assembly CallWorkflowActivities.dll e clique em Abrir. (Este é o assembly compilado na etapa 3 da seção Configurando esse exemplo deste documento.) Observe as duas novas entradas no topo da lista Componentes System.Activities.

  6. Clique em OK para adicionar as atividades CallWorkflowService e WorkflowCallableSequence na sua caixa de ferramentas. Sua caixa de ferramentas deve ser semelhante à captura de tela a seguir.

  7. Implementando o fluxo de trabalho ChildService: No Gerenciador de Soluções, renomeie Service1.xamlx como ChildService.xamlx.

  8. Na área principal do designer de ChildService, selecione a atividade Serviço Sequencial e pressione Delete.

  9. Arraste a atividade WorkflowCallableSequence da caixa de ferramentas para a superfície do WF designer. Isso abre a caixa de diálogo de configuração, que orientará você na tarefa de configurar ChildService como um participante do duplex durável.

  10. Configurando o WorkflowCallableSequence: Insira as propriedades da maneira indicada na captura de tela a seguir e clique em OK.

  11. Atualizando o arquivo web.config: O funcionamento de uma implementação duplex durável depende muito de que os itens de web.config estejam corretos. A tela Atualizações do Web.config gera automaticamente os itens necessários para o arquivo web.config do seu fluxo de trabalho filho.

    Dica

    O arquivo web.config em si não é atualizado automaticamente. Na próxima etapa, você copiará/colará os itens necessários no arquivo web.config.

  12. Clique em Copiar para a área de transferência & Fechar. Isso copia as entradas necessárias em destaque para a área de transferência, prontas para serem coladas no arquivo web.config. Clique em OK na caixa de mensagem.

  13. Abra o arquivo web.config para o projeto ChildService e cole o conteúdo da área de transferência (na etapa 12), logo após a marca <system.serviceModel>:

    ...
      <system.serviceModel>
    
        <services>
          <service name="ChildService">
            <endpoint address="" binding="wsHttpContextBinding" contract="ICallChildService" name="ChildServiceICallChildServiceStartWorkflow" />
          </service>
        </services>
        <client>
          <endpoint binding="wsHttpContextBinding" contract="ICallChildService" name="ChildServiceICallChildServiceWorkflowCompleted" />
        </client>
    
        <behaviors>
      ...
    
  14. Concluindo a implementação de ChildService: Para simplificar, no corpo deste fluxo de trabalho, vamos apenas atribuir o valor da solicitação à resposta (ambos são cadeias de caracteres por padrão. Porém, em uma implementação real, é possível atualizar para contratos de dados).

    1. Arraste uma atividade Atraso da caixa de ferramentas para a sequência Corpo. Configure a atividade Atraso com as seguintes propriedades: Duração = Novo TimeSpan(0, 2, 0).

    2. Arraste uma atividade Atribuição da caixa de ferramentas para a sequência Corpo, logo após a sequência Atraso. Configure a atividade Atribuição com as seguintes propriedades: Para = resposta; Valor = solicitação.

    3. Salve o projeto.

  15. Habilitando o serviço para hospedagem no IIS/WAS: Para configurar o fluxo de trabalho para hospedagem no IIS/WS e no AppFabric, no Gerenciador de Soluções, clique com o botão direito do mouse no projeto ChildService (não na solução) e selecione Propriedades.

  16. Selecione a terceira página de configuração, Web e, na seção Servidores, selecione Usar Servidor Web IIS Local. Clique em Criar Diretório Virtual e clique em OK na caixa de mensagem pop-up. Salve o projeto.

  17. Criando o fluxo de trabalho ParentService: No Gerenciador de Soluções, clique com o botão direito do mouse na solução (não no projeto) e selecione Adicionar - > Novo projeto. Selecione Aplicativo de Serviço de fluxo de trabalho WCF como tipo de projeto e atribua ao novo projeto o nome ParentService. Clique em OK.

  18. No Gerenciador de Soluções, renomeie Service1.xamlx para ParentService.xamlx.

  19. Arraste a atividade CallWorkflowService da caixa de ferramentas para a superfície do WF design, logo após a atividade SendResponse. Isso abre a caixa de diálogo de configuração de CallWorkflowService.

  20. Usando o botão “…”, navegue até a definição de fluxo de trabalho ChildService.xamlx, criada nas etapas anteriores, e selecione wsHttpContextBinding de forma que coincida com a seleção do protocolo na etapa 10. A janela de configuração deve ser semelhante à captura de tela a seguir.

    Dica

    Todas as configurações do contrato de serviço de solicitação/resposta e dos nomes de operação foram descobertos automaticamente a partir da definição de serviço filho.

  21. Clique em OK.

  22. Atualizando o arquivo web.config: A caixa de diálogo de atualizações de Web.config será aberta com as entradas necessárias para conexão ao serviço filho. Observe que o endereço real do ponto de extremidade filho, bem como o endereço do ponto de extremidade de retorno de chamada, requer entrada.

  23. Clique em Copiar para a área de transferência & Fechar. Isso copiará as entradas web.config destaque para a área de transferência, prontas para serem coladas no arquivo web.config. Clique em OK na caixa de mensagem pop-up.

  24. Abra o arquivo web.config do projeto ParentService e cole o conteúdo da área de transferência imediatamente após o elemento <system.serviceModel>.

    Dica

    Observe o comentário IMPORTANTE no XML - o serviço pai também precisa expor um ponto de extremidade para seus clientes. Para os efeitos deste exemplo, você pode usar o exemplo <ponto de extremidade>, definido como parte do comentário. O seu arquivo web.config deve ficar assim:

    ...
      <system.serviceModel>
    
        <services>
          <service name="Service1">
            <endpoint address="" binding="basicHttpBinding" contract="IService" />
            <endpoint address="ChildCallback" binding="wsHttpContextBinding" contract="ICallChildService" name="Service1ICallChildServiceWorkflowCompleted" />
          </service>
        </services>
        <client>
          <endpoint address="https://localhost/ChildService/ChildService.xamlx" binding="wsHttpContextBinding" bindingConfiguration="Service1ICallChildService_InitCallback" contract="ICallChildService" name="Service1ICallChildServiceStartWorkflow" />
        </client>
        <bindings>
          <wsHttpContextBinding>
            <binding name="Service1ICallChildService_InitCallback" clientCallbackAddress="https://localhost/ParentService/ParentService.xamlx/ChildCallback" />
          </wsHttpContextBinding>
        </bindings>
    
        <behaviors>
          <serviceBehaviors>
      ...
    
  25. Concluindo a implementação de ParentService: O fluxo de trabalho pai precisará transmitir valores de parâmetros para a chamada de serviço ao serviço filho.

    1. Para atribuir um valor à solicitação, arraste uma atividade Atribuição da caixa de ferramentas para a sequência Chamar Fluxo de Trabalho, pouco antes da atividade Enviar Solicitação. Configure a atividade Atribuição com as seguintes propriedades: Para = solicitação; Valor = data.ToString

    2. Salve o projeto.

  26. Habilitando o ParentService para hospedagem no IIS/WAS: Para configurar o fluxo de trabalho para hospedagem no IIS/WS e no AppFabric, no Gerenciador de Soluções, clique com o botão direito do mouse no projeto ParentService (não na solução) e selecione Propriedades.

  27. Selecione a terceira página de configuração - Web e, na seção Servidores, selecione Usar Servidor Web IIS Local. Clique em Criar Diretório Virtual e clique em OK na caixa de mensagem pop-up. Salve o projeto.

  28. Crie a solução.

  29. Configurando o IIS/WS para hospedar os serviços duráveis ParentService e ChildService: Iniciar o Gerenciador de Serviços de Informações da Internet (IIS): Clique em Iniciar, em Todos os Programas, em Microsoft AppFabric 1.1 para Windows Server e em Gerenciador dos Serviços de Informações da Internet (IIS).

  30. No painel esquerdo, expanda Sites e expanda Site Padrão.

  31. Localize o aplicativo ChildService, clique com o botão direito do mouse e selecione Gerenciar Aplicativo e selecione Configurações Avançadas.

  32. Atualize a propriedade Protocolos habilitados de http para http,net.pipe. (Observe que não há espaço após a vírgula.) Clique em OK para confirmar as alterações.

  33. Localize o aplicativo ParentService, clique com o botão direito do mouse e selecione Gerenciar Aplicativo e selecione Configurações Avançadas.

  34. Atualize a propriedade Protocolos habilitados de http para http,net.pipe. (Observe que não há espaço após a vírgula.) Clique em OK para confirmar as alterações.

  35. Execute WCFTestClient para iniciar uma instância de Fluxo de Trabalho pai. Execute o aplicativo Cliente de Teste do WCF com o seguinte comando: C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe (para plataformas de 32 bits) ou "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe" (para plataformas de 64 bits).

  36. Selecione Adicionar->Adicionar Serviço para adicionar uma referência ao serviço pai – https://localhost/ParentService/ParentService.xamlx.

  37. Depois que a referência for adicionada, clique duas vezes no método GetData() e no painel à esquerda, digite 123 como valor do parâmetro int. Clique em Invocar.

  38. Use o Painel do AppFabric para verificar o status das instâncias de ParentService e ChildService. Você perceberá que, após a conclusão de ChildService, o pai também será concluído, pois recebe a notificação de conclusão do filho.

Executando esse exemplo: Opção 2

  1. Inicie o Visual Studio 2010 com permissões administrativas.

    Importante

    Existem duas opções para executar esse exemplo e as etapas para ambas são apresentadas neste tópico. A Opção 1 acompanha a experiência ponta a ponta de usar as atividades WorkflowCallableSequence e CallWorkflowService para chamar um fluxo de trabalho filho a partir de um fluxo de trabalho pai, enquanto que a Opção 2 contempla apenas a solução final: uma implementação do duplex durável pronta para uso, ignorando completamente a experiência de projeto. Para obter mais informações, consulte a seção Demonstração abaixo.

  2. Abra <samples>\ Samples\Integration\Call Workflow (DurableDuplex)\DurableDuplex_with_CallWorkflowActivities\ DurableDuplex_with_CallWorkflowActivities.sln, onde <samples> é o caminho em que você instalou os exemplos do AppFabric.

  3. Verifique se o SampleClient está definido como o projeto de inicialização clicando com o botão direito do mouse no projeto SampleClient e clicando em Definir como Projeto de Inicialização.

  4. Pressione F5 para executar o exemplo. O aplicativo cliente de teste de exemplo será iniciado.

  5. Clique em Chamar Serviço Pai.

  6. Leia o texto Instâncias de fluxo de trabalho. Ele exibe os eventos de início/conclusão dos fluxos de trabalho pai e filho. Nesse exemplo, o pai inicia paralelamente três instâncias do serviço filho, usando a atividade ParallelForEach, e termina quando os três filhos estiverem concluídos. Você também pode acompanhar as instâncias de serviço pai/filho em execução, usando o Painel do AppFabric.

    Dica

    O fluxo de trabalho filho fica inativo por dois minutos após ter sido iniciado. Durante esse período, todas as instâncias pais e filhos entram no modo ocioso e persistem no armazenamento de persistência. Os eventos de conclusão ocorrerão após esse período de dois minutos.

Removendo esse exemplo

  1. Iniciar o Gerenciador de Serviços de Informações da Internet (IIS): Clique em Iniciar, em Todos os Programas, em Microsoft AppFabric 1.1 para Windows Server e em Gerenciador dos Serviços de Informações da Internet (IIS).

  2. Expanda o nó do servidor no modo de exibição de árvore à esquerda. Expanda Sites e expanda Site Padrão.

  3. Clique no nó SampleChildService e pressione Remover.

  4. Clique em Sim para confirmar a remoção do aplicativo selecionado.

  5. Clique no nó SampleParentService e pressione Remover.

  6. Clique em Sim para confirmar a remoção do aplicativo selecionado.

  7. Se você seguiu as instruções da Opção 1 em "Executando esse exemplo", também precisará:

    1. Clique no nó ChildService e pressione Remover.

    2. Clique em Sim para confirmar a remoção do aplicativo selecionado.

    3. Clique no nó ParentService e pressione Remover.

    4. Clique em Sim para confirmar a remoção do aplicativo selecionado.

Demonstra

Existem duas opções para executar esse exemplo e as etapas para ambas são apresentadas neste tópico. A Opção 1 é preferível à opção 2, pois acompanha a experiência ponta a ponta de usar as atividades WorkflowCallableSequence e CallWorkflowService para chamar um fluxo de trabalho filho a partir de um fluxo de trabalho pai, que é o principal objetivo desse exemplo. A Opção 2 contempla apenas a solução definitiva - uma implementação do duplex durável pronta para uso, ignorando completamente a experiência de projeto.

A Opção 1 em "Executando esse exemplo" demonstra como usar, em um projeto, as duas atividades personalizadas.

Em primeiro lugar, o serviço de fluxo de trabalho filho é criado; a atividade de serviço padrão Sequencial é excluída e substituída pela "atividade" WorkflowCallableSequence. WorkflowCallableSequence é uma fábrica de modelos de atividades que, de acordo com o que o usuário inserir, gera e configura as atividades de mensagens (Receber e Enviar), de forma que permitam a correlação de retornos. A correlação de retornos exige que o contexto de solicitação contenha um símbolo exclusivo de contexto usado para a correlação com o pai, além do endereço de retorno para o envio da notificação da conclusão. A atividade Receber inicializa um identificador de correlação de retorno a partir da solicitação recebida, ao passo que a atividade Enviar segue esse identificador para devolver a notificação de conclusão ao pai no endereço dinâmico de retorno transmitido com a solicitação inicial.

A lógica WorkflowCallableSequence também gera as entradas do web.config para o serviço, o serviço e os pontos de extremidade do cliente, além de todas as entradas de associação necessárias.

A próxima etapa cria o serviço de fluxo de trabalho Pai. A fábrica de modelos de atividade CallWorkflowService solicita a definição do filho, inspeciona sua configuração e, de acordo com isso, gera as atividades de mensagens (Enviar e Receber) necessárias para a comunicação duplex durável com o filho. A atividade Enviar inicializa a correlação de retorno (logicamente, esta é a etapa em que o símbolo único de contexto é gerado e transmitido junto com a solicitação ao fluxo de trabalho filho) e a atividade Receber correlaciona as notificações de conclusão que voltam do fluxo de trabalho filho, utilizando o mesmo símbolo de contexto (correlacionando com o indicador de correlação inicializado na atividade Enviar).

A lógica CallWorkflowService também gera as entradas do web.config para o serviço, o serviço e os pontos de extremidade do cliente, além de todas as entradas de associação necessárias. Observe o uso do atributo clientCallbackAddress na definição da configuração personalizada de associação. Este é o endereço que será incluído na mensagem de solicitação ao cliente para que ele possa responder dinamicamente ao chamador correto (neste caso, o fluxo de trabalho pai).

A Opção 2 em "Executando esse exemplo" oferece uma solução duplex durável pronta para execução que foi implementada usando WorkflowCallableSequence no fluxo de trabalho filho e CallWorkflowService no fluxo de trabalho pai.

O cliente faz uma chamada ao serviço pai que, por sua vez, inicia paralelamente três instâncias do serviço filho, usando a atividade ParallelForEach. Após receber a mensagem inicial do pai, o serviço filho entra fica inativo por dois minutos (usando uma atividade Atraso) e, após esse período, devolve uma notificação de conclusão ao pai. O pai só termina quando todas as instâncias do serviço filho forem concluídas. As instâncias pai e filho registram entradas no log de eventos do Aplicativo, usando "Exemplos" como fonte. A interface do usuário cliente monitora o log de eventos do Aplicativo para esta fonte de eventos para exibir os eventos de conclusão na caixa de texto Instâncias de Fluxo de Trabalho.

  2012-03-05