Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Расширение SendMessageChannelCache позволяет настраивать уровни общего доступа к кэшу, параметры кэша фабрики каналов и параметры кэша каналов для рабочих процессов, отправляющих сообщения конечным точкам службы с помощью Send действий обмена сообщениями. Эти рабочие процессы обычно являются клиентскими рабочими процессами, но также могут быть службами рабочих процессов, размещенными в объекте WorkflowServiceHost. Кэш фабрики каналов содержит кэшированные ChannelFactory<TChannel> объекты. Кэш каналов содержит кэшированные каналы.
Замечание
Рабочие процессы могут использовать Send действия обмена сообщениями для отправки сообщений или параметров. Среда выполнения рабочего процесса добавляет фабрики каналов в кэш, которые создают каналы типа IRequestChannel, когда используется действие ReceiveReply с действием Send, и каналы типа IOutputChannel, когда используется только действие Send (без ReceiveReply).
Уровни общего доступа к кэшу
По умолчанию в рабочем процессе, размещенном WorkflowServiceHost, кэш, используемый действиями обмена сообщениями Send, является общим для всех экземпляров рабочего процесса в WorkflowServiceHost (кэширование на уровне узла). Для клиентского рабочего процесса, который не размещается под WorkflowServiceHost, кэш доступен только экземпляру рабочего процесса (кэширование на уровне экземпляра). Кэш доступен только для Send действий, которые не используют конечные точки, определенные в конфигурации, если не включено небезопасное кэширование.
Ниже приведены различные уровни общего доступа к кэшу, доступные для Send действий в рабочем процессе, и их рекомендуемое использование:
Уровень узла. На уровне общего доступа узла кэш доступен только для экземпляров рабочих процессов, размещенных в узле службы рабочих процессов. Кэш также можно совместно использовать между узлами службы рабочих процессов в кэше на уровне процесса.
Уровень экземпляра. На уровне общего доступа экземпляра кэш доступен для определенного экземпляра рабочего процесса в течение всего времени существования, но кэш недоступен другим экземплярам рабочих процессов.
Нет кэша: кэш отключен по умолчанию, если у вас есть рабочий процесс, использующий конечные точки, определенные в конфигурации. Кроме того, рекомендуется сохранить отключенный кэш в этом случае, так как его включение может быть небезопасным. Например, если для каждой отправки требуется другое удостоверение (разные учетные данные или использование олицетворения).
Изменение уровня общего доступа к кэшу для клиентского рабочего процесса
Чтобы задать общий доступ к кэшу в клиентском рабочем процессе, добавьте экземпляр SendMessageChannelCache класса в качестве расширения в нужный набор экземпляров рабочих процессов. Это приводит к совместному использованию кэша во всех экземплярах рабочего процесса. В следующих примерах кода показано, как выполнить эти действия.
Сначала объявите экземпляр типа SendMessageChannelCache.
// Create an instance of SendMessageChannelCache with default cache settings.
static SendMessageChannelCache sharedChannelCacheExtension =
new SendMessageChannelCache();
Затем добавьте расширение кэша в каждый экземпляр рабочего процесса клиента.
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);
Изменение уровня совместного использования кэша для размещенной службы автоматизации процессов
Чтобы задать общий доступ к кэшу в размещенной службе рабочих процессов, добавьте экземпляр SendMessageChannelCache класса в качестве расширения ко всем узлам службы рабочих процессов. Это приводит к совместному использованию кэша во всех узлах службы рабочих процессов. В следующих примерах кода показано выполнение этих действий.
Сначала объявите экземпляр типа SendMessageChannelCache на уровне класса.
// Create static instance of SendMessageChannelCache with default cache settings.
static SendMessageChannelCache sharedChannelCacheExtension = new
SendMessageChannelCache();
Затем добавьте расширение статического кэша в каждый узел службы рабочих процессов.
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);
Чтобы установить общий доступ к кэшу в размещенной службе рабочих процессов на уровне экземпляра, добавьте Func<SendMessageChannelCache>
делегат в качестве расширения в хост службы рабочих процессов и назначьте этот делегат коду, который создает новый экземпляр класса SendMessageChannelCache. Это приводит к тому, что для каждого отдельного экземпляра рабочего процесса используется другой кэш, а не один кэш, общий для всех экземпляров рабочих процессов в узле службы рабочих процессов. В следующем примере кода показано, как добиться этого с помощью лямбда-выражения, чтобы напрямую определить SendMessageChannelCache расширение, на которое указывает делегат.
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 },
});
Настройка параметров кэша
Можно настроить параметры кэша для кэша создания каналов и кэша каналов. Параметры кэша задаются в классе ChannelCacheSettings. Класс SendMessageChannelCache определяет параметры кэша по умолчанию для кэша фабрики каналов и кэша каналов в его конструкторе без параметров. В следующей таблице перечислены значения по умолчанию этих параметров кэша для каждого типа кэша.
Настройки | LeaseTimeout (мин) | Таймаут простоя (мин) | MaxItemsInCache |
---|---|---|---|
Фабричный кэш по умолчанию | TimeSpan.MaxValue (максимальное значение для TimeSpan) | 2 | 16 |
Кэш каналов по умолчанию | 5 | 2 | 16 |
Чтобы настроить параметры кэша фабрики и кэша каналов, создайте экземпляр класса SendMessageChannelCache с помощью параметризованного конструктора SendMessageChannelCache и передайте новый экземпляр ChannelCacheSettings с пользовательскими значениями каждому из параметров factorySettings
и channelSettings
. Затем добавьте новый экземпляр этого класса в виде расширения к узлу службы рабочих процессов или к экземпляру рабочего процесса. В следующем примере кода показано, как выполнить эти действия для экземпляра рабочего процесса.
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);
Чтобы включить кэширование, если в конфигурации вашей службы рабочего процесса определены конечные точки, создайте экземпляр класса SendMessageChannelCache с помощью параметризованного конструктора SendMessageChannelCache, установив параметр allowUnsafeCaching
в значение true
. Затем добавьте новый экземпляр этого класса в виде расширения к узлу службы рабочих процессов или к экземпляру рабочего процесса. В следующем примере кода показано, как включить кэширование для экземпляра рабочего процесса.
SendMessageChannelCache customChannelCacheExtension =
new SendMessageChannelCache{ AllowUnsafeCaching = true };
clientInstance.Extensions.Add(customChannelCacheExtension);
Чтобы полностью отключить кэш для фабрик каналов и самих каналов, отключите кэш фабрики каналов. Это также отключает кэш каналов, так как каналы принадлежат соответствующим фабрикам каналов. Чтобы отключить кэш фабрики каналов, передайте параметр factorySettings
в конструктор SendMessageChannelCache, инициализированный экземпляром ChannelCacheSettings со значением MaxItemsInCache равным 0. В следующем примере кода показано следующее.
// 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);
Вы можете выбрать использование только кэша фабрики каналов и отключить кэш канала, передав параметр channelSettings
в конструктор SendMessageChannelCache, инициализированный экземпляром ChannelCacheSettings со значением MaxItemsInCache 0. В следующем примере кода показано следующее.
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);
В размещенной службе рабочих процессов можно указать параметры кэша фабрики и кэша каналов в файле конфигурации приложения. Для этого добавьте поведение службы, содержащее параметры кэша для кэша фабрики и канала, и добавьте это поведение службы в службу. В следующем примере показано содержимое файла конфигурации, содержащего MyChannelCacheBehavior
поведение службы с параметрами пользовательского кэша фабрики и кэша каналов. Это поведение службы добавляется в службу с помощью атрибута 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>