Compartilhar via


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

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 podem ser serviços de fluxo de trabalho hospedados em um WorkflowServiceHost. O cache de fábrica de canais contém objetos ChannelFactory<TChannel> armazenados em cache. O cache do canal contém canais armazenados em cache.

Observação

Os fluxos de trabalho podem usar Send atividades de mensagens 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 de Send é compartilhado entre todas as instâncias de fluxo de trabalho no WorkflowServiceHost (cache a nível de host). Para um fluxo de trabalho do cliente que não é hospedado por um WorkflowServiceHost, o cache está disponível apenas para a instância do fluxo de trabalho (cache no nível da 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 Send atividades em um fluxo de trabalho e seu uso recomendado:

  • Nível do host: no nível de compartilhamento do host, o cache está disponível apenas para as instâncias de fluxo de trabalho hospedadas no host do 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 abrangente para todo o processo.

  • Nível da 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 ao longo de seu tempo de vida, mas o cache não está disponível para outras instâncias de fluxo de trabalho.

  • Sem Cache: o cache é desativado por padrão se você tiver um fluxo de trabalho que usa pontos de extremidade definidos na configuração. Também é recomendável manter o cache desativado nesse caso porque 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.

Alterando 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 SendMessageChannelCache classe como uma extensão ao conjunto desejado de instâncias de fluxo de trabalho. Isso resulta no compartilhamento do cache em todas as instâncias de fluxo de trabalho. Os exemplos de código a seguir mostram como executar essas etapas.

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);  

Alterando 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 SendMessageChannelCache classe como uma extensão a todos os hosts do serviço de fluxo de trabalho. Isso resulta no compartilhamento do cache em todos os hosts do serviço de fluxo de trabalho. Os exemplos de código a seguir mostram para executar essas etapas.

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 Func<SendMessageChannelCache> delegado como uma extensão ao host do serviço de fluxo de trabalho e atribua esse delegado ao código que cria uma instância nova da SendMessageChannelCache classe. Isso 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 do 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 SendMessageChannelCache extensão à 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 },  
});  

Personalizando 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 ChannelCacheSettings classe. A classe SendMessageChannelCache define as configurações de cache padrão para o cache de fábrica de canal e o cache de canal em seu 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 de ChannelCacheSettings com valores personalizados para cada um dos parâmetros factorySettings e channelSettings. Em seguida, adicione a nova instância dessa classe como uma 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 essas 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 uma 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. Isso também desativa o cache do canal, já que os canais são geridos por suas respectivas fábricas de canais. 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 de fluxo de trabalho hospedado, você pode especificar as configurações de cache de fábrica e cache de canal no arquivo de configuração do aplicativo. Para fazer isso, adicione um comportamento de serviço que contenha as configurações de cache para o cache de fábrica e de canal e adicione 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 MyChannelCacheBehavior serviço com as configurações personalizadas de cache de fábrica e cache de canal. Esse comportamento de serviço é adicionado ao serviço por meio do behaviorConfiguration atributo.

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