Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La extensión SendMessageChannelCache le permite personalizar los niveles de uso compartido de la memoria caché, la configuración de la memoria caché del generador de canales y la de la memoria caché del canal para los flujos de trabajo que envían mensajes a los puntos de conexión de servicio utilizando las actividades de mensajería de Send. Estos flujos de trabajo suelen ser flujos de trabajo para clientes, pero también pueden ser servicios de flujo de trabajo alojados en un WorkflowServiceHost. La memoria caché del generador de canales contiene objetos ChannelFactory<TChannel> almacenados en caché. La memoria caché del canal contiene canales almacenados en memoria caché.
Nota:
Los flujos de trabajo pueden usar Send actividades de mensajería para enviar mensajes o parámetros. El tiempo de ejecución del flujo de trabajo agrega los generadores de canales a la memoria caché que crean canales de tipo IRequestChannel cuando se usa una actividad ReceiveReply con una actividad Send y IOutputChannel cuando se usa solo una actividad Send (sin ReceiveReply).
Niveles de uso compartido de caché
De forma predeterminada, en un flujo de trabajo hospedado por WorkflowServiceHost, la caché utilizada por las actividades de mensajería de Send se comparte entre todas las instancias de flujo de trabajo en WorkflowServiceHost (caché a nivel de host). Para un flujo de trabajo de cliente que no está hospedado por WorkflowServiceHost, la memoria caché solo está disponible para la instancia de flujo de trabajo (almacenamiento en caché de nivel de instancia). La memoria caché solo está disponible para Send las actividades que no usan puntos de conexión definidos en la configuración a menos que esté habilitado el almacenamiento en caché no seguro.
A continuación se muestran los distintos niveles de uso compartido de caché disponibles para Send las actividades de un flujo de trabajo y su uso recomendado:
Nivel de host: en el nivel de uso compartido del host, la memoria caché solo está disponible para las instancias de flujo de trabajo hospedadas en el host del servicio de flujo de trabajo. Además, la memoria caché también puede compartirse entre los hosts de servicio de flujo de trabajo en una memoria caché de todo el proceso.
Nivel de instancia: en el nivel de uso compartido de instancias, la memoria caché está disponible para una instancia de flujo de trabajo determinada a lo largo de su duración, pero la memoria caché no está disponible para otras instancias de flujo de trabajo.
Sin caché: la memoria caché está desactivada de forma predeterminada si tiene un flujo de trabajo que usa puntos de conexión definidos en la configuración. También se recomienda mantener desactivada la memoria caché en este caso porque activarla podría no ser segura. Por ejemplo, si se requiere una identidad diferente (credenciales diferentes o el uso de la suplantación) para cada envío.
Cambio del nivel de uso compartido de caché para un flujo de trabajo de cliente
Para establecer el uso compartido de caché en un flujo de trabajo de cliente, agregue una instancia de la SendMessageChannelCache clase como una extensión al conjunto deseado de instancias de flujo de trabajo. Esto da como resultado el uso compartido de la memoria caché en todas las instancias de flujo de trabajo. En los ejemplos de código siguientes se muestra cómo realizar estos pasos.
En primer lugar, declare una instancia de tipo SendMessageChannelCache.
// Create an instance of SendMessageChannelCache with default cache settings.
static SendMessageChannelCache sharedChannelCacheExtension =
new SendMessageChannelCache();
A continuación, agregue la extensión de caché a cada instancia de flujo de trabajo de 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);
Cambio del nivel de uso compartido de caché para un servicio de flujo de trabajo hospedado
Para establecer el uso compartido de caché en un servicio de flujo de trabajo hospedado, agregue una instancia de la SendMessageChannelCache clase como una extensión a todos los hosts del servicio de flujo de trabajo. Esto da como resultado el uso compartido de la memoria caché en todos los hosts del servicio de flujo de trabajo. Los siguientes ejemplos de código muestran cómo realizar estos pasos.
En primer lugar, declare una instancia de tipo SendMessageChannelCache en el nivel de clase.
// Create static instance of SendMessageChannelCache with default cache settings.
static SendMessageChannelCache sharedChannelCacheExtension = new
SendMessageChannelCache();
A continuación, agregue la extensión de caché estática a cada host de servicio de flujo de trabajo.
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 establecer el uso compartido de caché en un servicio de flujo de trabajo hospedado en el nivel de instancia, agregue un Func<SendMessageChannelCache>
delegado como una extensión al host del servicio de flujo de trabajo y asigne este delegado al código que crea una instancia nueva de la SendMessageChannelCache clase. Esto da como resultado una caché diferente para cada instancia de flujo de trabajo individual, en lugar de una sola caché compartida por todas las instancias de flujo de trabajo en el host del servicio de flujo de trabajo. En el ejemplo de código siguiente se muestra cómo lograr esto mediante una expresión lambda para definir directamente la extensión SendMessageChannelCache a la que apunta el delegado.
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 },
});
Personalización de la configuración de caché
Puede personalizar la configuración de la memoria caché para la memoria caché del generador de canales y del canal. La configuración de caché se define en la ChannelCacheSettings clase . La SendMessageChannelCache clase define la configuración de caché predeterminada para la caché del generador de canales y la caché del canal en su constructor sin parámetros. En la tabla siguiente se enumeran los valores predeterminados de esta configuración de caché para cada tipo de caché.
Configuración | TiempoDeArrendamiento (minutos) | TiempoDeInactividad (minutos) | NúmeroMáximoDeElementosEnCaché |
---|---|---|---|
Valor predeterminado de la memoria caché del generador | TimeSpan.MaxValue | 2 | 16 |
Valor predeterminado de caché de canales | 5 | 2 | 16 |
Para personalizar la configuración de caché de fábrica y caché de canal, cree una instancia de la SendMessageChannelCache clase mediante el constructor con parámetros SendMessageChannelCache y pase una nueva instancia de ChannelCacheSettings con valores personalizados a cada uno de los factorySettings
parámetros y channelSettings
. A continuación, agregue la nueva instancia de esta clase como una extensión a un host de servicio de flujo de trabajo o una instancia de flujo de trabajo. En el ejemplo de código siguiente se muestra cómo realizar estos pasos para una instancia de flujo de trabajo.
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 el almacenamiento en caché cuando el servicio de flujo de trabajo tiene puntos de conexión definidos en la configuración, cree una instancia de la clase SendMessageChannelCache mediante el constructor SendMessageChannelCache con el parámetro allowUnsafeCaching
establecido en true
. A continuación, agregue la nueva instancia de esta clase como una extensión a un host de servicio de flujo de trabajo o una instancia de flujo de trabajo. En el ejemplo de código siguiente se muestra cómo habilitar el almacenamiento en caché para una instancia de flujo de trabajo.
SendMessageChannelCache customChannelCacheExtension =
new SendMessageChannelCache{ AllowUnsafeCaching = true };
clientInstance.Extensions.Add(customChannelCacheExtension);
Para deshabilitar la memoria caché por completo para los generadores de canales y los canales, deshabilite la caché del generador de canales. Al hacerlo, también se desactiva la caché del canal, ya que los canales son propiedad de sus generadores de canales correspondientes. Para deshabilitar la memoria caché del generador de canales, pase el parámetro factorySettings
al constructor SendMessageChannelCache inicializado en una instancia de ChannelCacheSettings con un valor de 0 para MaxItemsInCache. En el ejemplo de código siguiente se muestra esto.
// 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);
Puede decidir usar sólo la memoria caché del generador de canales y deshabilitar la memoria caché del canal pasando el parámetro channelSettings
al constructor SendMessageChannelCache inicializado para una instancia de ChannelCacheSettings con un valor 0 para MaxItemsInCache. En el ejemplo de código siguiente se muestra esto.
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);
En un servicio de flujo de trabajo hospedado, puede especificar la caché de fábrica y la configuración de caché del canal en el archivo de configuración de la aplicación. Para ello, agregue un comportamiento de servicio que contenga los valores de memoria caché para el generador y memoria caché del canal, y agregue este comportamiento de servicio a su servicio. En el ejemplo siguiente se muestra el contenido de un archivo de configuración que contiene el comportamiento del MyChannelCacheBehavior
servicio con la caché de fábrica personalizada y la configuración de caché del canal. Este comportamiento de servicio se agrega al servicio a través del 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>