Alterando os níveis de compartilhamento de cache para atividades de envio
A SendMessageChannelCache extensão permite personalizar os níveis de compartilhamento de cache, as configurações do cache de fábrica do canal e as configurações do cache do canal para fluxos de trabalho que enviam mensagens para pontos de extremidade de serviço usando Send atividades de mensagens. Esses fluxos de trabalho geralmente são fluxos de trabalho de cliente, mas também podem ser serviços de fluxo de trabalho hospedados em um WorkflowServiceHostarquivo . O cache de fábrica do canal contém objetos armazenados em ChannelFactory<TChannel> cache. O cache de canais contém canais armazenados em cache.
Nota
Os fluxos de trabalho podem usar Send atividades de mensagens para enviar mensagens ou parâmetros. O tempo de execução do fluxo de trabalho adiciona fábricas de canais ao cache que criam canais do tipo IRequestChannel quando você usa uma ReceiveReply atividade com uma Send atividade e um IOutputChannel quando apenas usa uma Send atividade (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 Send atividades de mensagens é compartilhado entre todas as instâncias de fluxo de trabalho no (cache no nível do WorkflowServiceHost host). Para um fluxo de trabalho 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 Send atividades que não usam pontos de extremidade definidos na configuração, a menos que o cache não seguro esteja habilitado.
A seguir estão os diferentes níveis de compartilhamento de cache disponíveis para Send atividades em um fluxo de trabalho e seu 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 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 de 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 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 é recomendado manter o cache desligado neste caso, porque ligá-lo pode ser inseguro. Por exemplo, se uma identidade diferente (credenciais diferentes ou usando representação) for necessária para cada envio.
Alterando o nível de compartilhamento de cache para um fluxo de trabalho de cliente
Para definir o compartilhamento de cache em um fluxo de trabalho 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 do 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 para todos os hosts de serviço de fluxo de trabalho. Isso resulta no compartilhamento do cache entre todos os hosts de 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 instancia uma nova instância 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 conseguir isso usando uma expressão lambda para definir diretamente a SendMessageChannelCache extensão 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 },
});
Personalizando configurações de cache
Você pode personalizar as configurações de cache para o cache de fábrica do canal e o cache do canal. As configurações de ChannelCacheSettings cache são definidas na classe. A SendMessageChannelCache classe define as configurações de cache padrão para o cache de fábrica do canal e o cache do 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.
Definições | LeaseTimeout (min) | IdleTimeout (min) | MaxItemsInCache |
---|---|---|---|
Padrão de cache de fábrica | TimeSpan.MaxValue | 2 | 16 |
Padrão de cache de canal | 5 | 2 | 16 |
Para personalizar as configurações de cache de fábrica e cache de canal, instancie a SendMessageChannelCache classe usando o construtor SendMessageChannelCache parametrizado e passe uma nova instância do ChannelCacheSettings com valores personalizados para cada um factorySettings
dos parâmetros and channelSettings
. Em seguida, adicione a nova instância dessa classe como uma extensão para um host de serviço de fluxo de trabalho ou 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 pontos de extremidade definidos na configuração, instancie a SendMessageChannelCache classe usando o construtor SendMessageChannelCache parametrizado com o allowUnsafeCaching
parâmetro definido como true
. Em seguida, adicione a nova instância dessa classe como uma extensão para um host de serviço de fluxo de trabalho ou 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 desativar completamente o cache para as fábricas de canais e os canais, desative o cache de fábrica de canais. Isso também desativa o cache de canais, pois os canais são de propriedade de suas fábricas de canais correspondentes. Para desabilitar o cache de fábrica do canal, passe o factorySettings
parâmetro para o SendMessageChannelCache construtor inicializado para uma ChannelCacheSettings instância com um MaxItemsInCache valor 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 do canal e desabilitar o cache do canal passando o channelSettings
parâmetro para o SendMessageChannelCache construtor inicializado para uma ChannelCacheSettings instância com um MaxItemsInCache valor 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 MyChannelCacheBehavior
comportamento de 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>