Alterando os níveis de compartilhamento de cache para enviar atividades

A extensão SendMessageChannelCache permite personalizar os níveis de compartilhamento de cache, as configurações do cache de fábrica de canais e as configurações do cache de canal para fluxos de trabalho que enviam mensagens aos pontos de extremidade de serviço usando as atividades de mensagem Send. Esses fluxos de trabalho normalmente são fluxos de trabalho do cliente, mas também pode ser o serviços de fluxo de trabalho que são hospedados em um WorkflowServiceHost. O cache de fábrica de canais contém objetos ChannelFactory<TChannel> armazenados em cache. O cache de canal contém canais armazenados em cache.

Observação

Os fluxos de trabalho podem usar as atividades de mensagens Send para enviar mensagens ou parâmetros. O runtime do fluxo de trabalho adiciona fábricas de canais ao cache que criam canais do tipo IRequestChannel, quando você usa uma atividade ReceiveReply com uma atividade Send e um IOutputChannel ao usar apenas uma atividade Send (não ReceiveReply).

Os níveis de compartilhamento de cache

Por padrão, em um fluxo de trabalho hospedado por um WorkflowServiceHost, o cache usado pelas atividades de mensagens Send é compartilhado entre todas as instâncias de fluxo de trabalho no WorkflowServiceHost (cache de nível de host). Um fluxo de trabalho de cliente não é hospedado por um WorkflowServiceHost, o cache está disponível somente para a instância de fluxo de trabalho (cache de nível de instância). O cache só está disponível para atividades Send que não usam os pontos de extremidade definidos na configuração, a menos que o cache desprotegido esteja habilitado.

Veja a seguir os diferentes níveis de compartilhamento de cache disponíveis para atividades Send em um fluxo de trabalho e o uso recomendado:

  • Nível de Host: no nível de compartilhamento de host, o cache está disponível apenas para as instâncias de fluxo de trabalho hospedadas no host de serviço de fluxo de trabalho. Um cache também pode ser compartilhado entre hosts de serviço de fluxo de trabalho em um cache em todo o processo.

  • Nível de Instância: no nível de compartilhamento de instância, o cache está disponível para uma instância de fluxo de trabalho específica, durante todo o tempo de vida, mas o cache não está disponível para outras instâncias de fluxo de trabalho.

  • Sem Cache: o cache será desativado por padrão, se você tiver um fluxo de trabalho que usa os pontos de extremidade definidos na configuração. Também é recomendável manter o cache desativado nesse caso, pois ativá-lo pode não ser seguro. Por exemplo, se uma identidade diferente (credenciais diferentes ou uso de representação) for necessária para cada envio.

Como alterar o Nível de Compartilhamento de Cache para um Fluxo de Trabalho do Cliente

Para definir o compartilhamento de cache em um fluxo de trabalho do cliente, adicione uma instância da classe SendMessageChannelCache como extensão ao conjunto desejado de instâncias de fluxo de trabalho. Essa ação resulta no compartilhamento do cache em todas as instâncias de fluxo de trabalho. Os exemplos de código a seguir mostram como executar estas tarefas:

Primeiro, declare uma instância do tipo SendMessageChannelCache.

// Create an instance of SendMessageChannelCache with default cache settings.  
static SendMessageChannelCache sharedChannelCacheExtension =  
    new SendMessageChannelCache();  

Em seguida, adicione a extensão de cache a cada instância de fluxo de trabalho do cliente.

WorkflowApplication clientInstance1 = new WorkflowApplication(new clientWorkflow1());  
WorkflowApplication clientInstance2 = new WorkflowApplication(new clientWorkflow2());  
  
// Share the cache extension object
  
clientInstance1.Extensions.Add(sharedChannelCacheExtension);  
clientInstance2.Extensions.Add(sharedChannelCacheExtension);  

Como alterar o nível de compartilhamento de cache para um Serviço de Fluxo de Trabalho Hospedado

Para definir o compartilhamento de cache em um serviço de fluxo de trabalho hospedado, adicione uma instância da classe SendMessageChannelCache como extensão a todos os hosts de serviço de fluxo de trabalho. Essa ação resulta no compartilhamento do cache em todos os host de serviços de serviço de fluxo de trabalho. Os exemplos de código a seguir mostram como executar estas tarefas.

Primeiro, declare uma instância do tipo SendMessageChannelCache no nível da classe.

// Create static instance of SendMessageChannelCache with default cache settings.  
static SendMessageChannelCache sharedChannelCacheExtension = new  
    SendMessageChannelCache();  

Em seguida, adicione a extensão de cache estático a cada host de serviço de fluxo de trabalho.

WorkflowServiceHost host1 = new WorkflowServiceHost(new serviceWorkflow1(), new Uri(baseAddress1));  
WorkflowServiceHost host2 = new WorkflowServiceHost(new serviceWorkflow2(), new Uri(baseAddress2));  
  
// Share the static cache to get an AppDomain level cache.  
host1.WorkflowExtensions.Add(sharedChannelCacheExtension);  
host2.WorkflowExtensions.Add(sharedChannelCacheExtension);  

Para definir o compartilhamento de cache em um serviço de fluxo de trabalho hospedado para o nível da instância, adicione um delegado Func<SendMessageChannelCache> como extensão ao host de serviço de fluxo de trabalho e atribua esse delegado ao código que instancia uma nova instância da classe SendMessageChannelCache. Essa ação resulta em um cache diferente para cada instância de fluxo de trabalho individual, em vez de um único cache compartilhado por todas as instâncias de fluxo de trabalho no host de serviço de fluxo de trabalho. O exemplo de código a seguir mostra como fazer isso, usando uma expressão lambda para definir diretamente a extensão SendMessageChannelCache para a qual o delegado aponta.

serviceHost.WorkflowExtensions.Add(() => new SendMessageChannelCache  
{  
    // Use FactorySettings property to add custom factory cache settings.  
    FactorySettings = new ChannelCacheSettings
    { MaxItemsInCache = 5, },  
    // Use ChannelSettings property to add custom channel cache settings.  
    ChannelSettings = new ChannelCacheSettings
    { MaxItemsInCache = 10 },  
});  

Personalização das Configurações de Cache

Você pode personalizar as configurações de cache para o cache da fábrica de canais e o cache de canal. As configurações de cache são definidas na classe ChannelCacheSettings. A classe SendMessageChannelCache define as configurações de cache padrão para o cache de fábrica de canais e o cache de canal no construtor sem parâmetros. A tabela a seguir lista os valores padrão dessas configurações de cache para cada tipo de cache.

Configurações LeaseTimeout (min) IdleTimeout (min) MaxItemsInCache
Padrão do Cache de Fábrica TimeSpan.MaxValue 2 16
Padrão do Cache de Canal 5 2 16

Para personalizar as configurações de cache de fábrica e de cache de canal, instancie a classe SendMessageChannelCache usando o construtor parametrizado SendMessageChannelCache e passe uma nova instância do ChannelCacheSettings, com valores personalizados para cada um dos parâmetros factorySettings e channelSettings. Em seguida, adicione a nova instância dessa classe como extensão a um host de serviço de fluxo de trabalho ou a uma instância de fluxo de trabalho. O exemplo de código a seguir mostra como executar estas etapas para uma instância de fluxo de trabalho.

ChannelCacheSettings factorySettings = new ChannelCacheSettings{  
                        MaxItemsInCache = 5,
                        IdleTimeout = TimeSpan.FromMinutes(5),
                        LeaseTimeout = TimeSpan.FromMinutes(20)};  
  
ChannelCacheSettings channelSettings = new ChannelCacheSettings{  
                        MaxItemsInCache = 5,
                        IdleTimeout = TimeSpan.FromMinutes(2),  
                        LeaseTimeout = TimeSpan.FromMinutes(10) };  
  
SendMessageChannelCache customChannelCacheExtension =
    new SendMessageChannelCache(factorySettings, channelSettings);  
  
clientInstance.Extensions.Add(customChannelCacheExtension);  

Para habilitar o cache quando o serviço de fluxo de trabalho tiver os pontos de extremidade definidos na configuração, instancie a classe SendMessageChannelCache usando o construtor parametrizado SendMessageChannelCache, com o parâmetro allowUnsafeCaching definido como true. Em seguida, adicione a nova instância dessa classe como extensão a um host de serviço de fluxo de trabalho ou a uma instância de fluxo de trabalho. O exemplo de código a seguir mostra como habilitar o cache para uma instância de fluxo de trabalho.

SendMessageChannelCache customChannelCacheExtension =
    new SendMessageChannelCache{ AllowUnsafeCaching = true };  
  
clientInstance.Extensions.Add(customChannelCacheExtension);  

Para desabilitar o cache completamente para as fábricas de canais e os canais, desabilite o cache de fábrica de canais. Essa ação também desativa o cache de canal, pois os canais pertencem às fábricas de canais correspondentes. Para desabilitar o cache de fábrica de canais, passe o parâmetro factorySettings para o construtor SendMessageChannelCache inicializado para uma instância ChannelCacheSettings com um valor MaxItemsInCache de 0. O exemplo de código a seguir mostra isso.

// Disable the factory cache. This results in the channel cache to be turned off as well.  
ChannelCacheSettings factorySettings = new ChannelCacheSettings  
    { MaxItemsInCache = 0 };  
  
ChannelCacheSettings channelSettings = new ChannelCacheSettings();  
  
SendMessageChannelCache customChannelCacheExtension =
    new SendMessageChannelCache(factorySettings, channelSettings);
  
clientInstance.Extensions.Add(customChannelCacheExtension);  

Você pode optar por usar apenas o cache de fábrica de canais e desabilitar o cache de canal, passando o parâmetro channelSettings para o construtor SendMessageChannelCache inicializado para uma instância ChannelCacheSettings com um valor MaxItemsInCache de 0. O exemplo de código a seguir mostra isso.

ChannelCacheSettings factorySettings = new ChannelCacheSettings();  
// Disable only the channel cache.  
ChannelCacheSettings channelSettings = new ChannelCacheSettings  
    { MaxItemsInCache = 0};  
  
SendMessageChannelCache customChannelCacheExtension =
    new SendMessageChannelCache(factorySettings, channelSettings);
  
clientInstance.Extensions.Add(customChannelCacheExtension);  

Em um serviço hospedado de fluxo de trabalho, você pode especificar os cache e o canal cache configurações de fábrica no arquivo de configuração do aplicativo. Para fazer isso, adicionar um comportamento de serviço que contém as configurações de cache para cache de fábrica e o canal e adicionar esse comportamento de serviço ao seu serviço. O exemplo a seguir mostra o conteúdo de um arquivo de configuração que contém o comportamento do serviço MyChannelCacheBehavior com as configurações personalizadas de cache de fábrica e cache de canais. Esse comportamento de serviço é adicionado ao serviço por meio do atributo behaviorConfiguration.

<configuration>
  <system.serviceModel>  
    <!-- List of other config sections here -->
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="MyChannelCacheBehavior">  
          <sendMessageChannelCache allowUnsafeCaching ="false" >  
            <!-- Control only the host level settings -->
            <factorySettings maxItemsInCache = "8" idleTimeout = "00:05:00" leaseTimeout="10:00:00" />  
            <channelSettings maxItemsInCache = "32" idleTimeout = "00:05:00" leaseTimeout="00:06:00" />  
          </sendMessageChannelCache>  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    <services>  
      <service name="MyService" behaviorConfiguration="MyChannelCacheBehavior" />  
    </services>  
  </system.serviceModel>  
</configuration>