Ändra cachedelningsnivåer för skicka aktiviteter
Med SendMessageChannelCache tillägget kan du anpassa cachedelningsnivåer, inställningarna för kanalfabrikens cacheminne och inställningarna för kanalcachen för arbetsflöden som skickar meddelanden till tjänstslutpunkter med hjälp Send av meddelandeaktiviteter. Dessa arbetsflöden är vanligtvis klientarbetsflöden men kan också vara arbetsflödestjänster som finns i en WorkflowServiceHost. Kanalfabrikens cacheminne innehåller cachelagrade ChannelFactory<TChannel> objekt. Kanalcachen innehåller cachelagrade kanaler.
Kommentar
Arbetsflöden kan använda Send meddelandeaktiviteter för att skicka meddelanden eller parametrar. Arbetsflödeskörningen lägger till kanalfabriker i cacheminnet som skapar kanaler av typen IRequestChannel när du använder en ReceiveReply aktivitet med en Send aktivitet och en IOutputChannel när du bara använder en Send aktivitet (nej ReceiveReply).
Cachedelningsnivåer
Som standard delas i ett arbetsflöde som hanteras av en WorkflowServiceHost cache som används av Send meddelandeaktiviteter över alla arbetsflödesinstanser i (cachelagring på WorkflowServiceHost värdnivå). För ett klientarbetsflöde som inte hanteras av en WorkflowServiceHostär cachen endast tillgänglig för arbetsflödesinstansen (cachelagring på instansnivå). Cachen är endast tillgänglig för Send aktiviteter som inte använder slutpunkter som definierats i konfigurationen om inte osäker cachelagring är aktiverat.
Följande är de olika cachedelningsnivåer som är tillgängliga för Send aktiviteter i ett arbetsflöde och deras rekommenderade användning:
Värdnivå: På värddelningsnivån är cachen endast tillgänglig för arbetsflödesinstanserna som finns i arbetsflödestjänstvärden. En cache kan också delas mellan arbetsflödestjänstvärdar i en processomfattande cache.
Instansnivå: På instansdelningsnivån är cachen tillgänglig för en viss arbetsflödesinstans under hela dess livslängd, men cachen är inte tillgänglig för andra arbetsflödesinstanser.
Ingen cache: Cachen är inaktiverad som standard om du har ett arbetsflöde som använder slutpunkter som definierats i konfigurationen. Vi rekommenderar också att du håller cachen avstängd i det här fallet eftersom det kan vara osäkert att aktivera det. Om till exempel en annan identitet (olika autentiseringsuppgifter eller personifiering) krävs för varje sändning.
Ändra cachedelningsnivå för ett klientarbetsflöde
Om du vill ange cachedelning i ett klientarbetsflöde lägger du till en instans av SendMessageChannelCache klassen som ett tillägg till önskad uppsättning arbetsflödesinstanser. Detta resulterar i att cacheminnet delas över alla arbetsflödesinstanser. Följande kodexempel visar hur du utför de här stegen.
Deklarera först en instans av typen SendMessageChannelCache.
// Create an instance of SendMessageChannelCache with default cache settings.
static SendMessageChannelCache sharedChannelCacheExtension =
new SendMessageChannelCache();
Lägg sedan till cachetillägget till varje klientarbetsflödesinstans.
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);
Ändra cachedelningsnivå för en värdbaserad arbetsflödestjänst
Om du vill ange cachedelning i en värdbaserad arbetsflödestjänst lägger du till en instans av SendMessageChannelCache klassen som ett tillägg till alla arbetsflödestjänstvärdar. Detta resulterar i att cacheminnet delas mellan alla värdar för arbetsflödestjänsten. Följande kodexempel visar hur du utför de här stegen.
Deklarera först en instans av typen SendMessageChannelCache på klassnivå.
// Create static instance of SendMessageChannelCache with default cache settings.
static SendMessageChannelCache sharedChannelCacheExtension = new
SendMessageChannelCache();
Lägg sedan till tillägget för statisk cache till varje arbetsflödestjänstvärd.
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);
Om du vill ange cachedelningen i en värdbaserad arbetsflödestjänst till instansnivå lägger du till ett Func<SendMessageChannelCache>
ombud som ett tillägg till arbetsflödestjänstvärden och tilldelar det här ombudet till koden som instansierar en ny instans av SendMessageChannelCache klassen. Detta resulterar i en annan cache för varje enskild arbetsflödesinstans, i stället för en enda cache som delas av alla arbetsflödesinstanser i arbetsflödestjänstvärden. I följande kodexempel visas hur du uppnår detta genom att använda ett lambda-uttryck för att direkt definiera tillägget SendMessageChannelCache som ombudet pekar på.
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 },
});
Anpassa Cache Inställningar
Du kan anpassa cacheinställningarna för kanalfabrikens cacheminne och kanalcachen. Cacheinställningarna definieras i ChannelCacheSettings klassen. Klassen SendMessageChannelCache definierar standardcacheinställningar för kanalfabrikens cacheminne och kanalcachen i dess parameterlösa konstruktor. I följande tabell visas standardvärdena för dessa cacheinställningar för varje typ av cache.
Inställningar | LeaseTimeout (min) | IdleTimeout (min) | MaxItemsInCache |
---|---|---|---|
Standard för Fabrikscache | TimeSpan.MaxValue | 2 | 16 |
Standard för kanalcache | 5 | 2 | 16 |
Om du vill anpassa inställningarna för fabrikscache och kanalcache instansierar SendMessageChannelCache du klassen med hjälp av den parametriserade konstruktorn SendMessageChannelCache och skickar en ny instans av ChannelCacheSettings med anpassade värden till var och en av parametrarna factorySettings
och channelSettings
. Lägg sedan till den nya instansen av den här klassen som ett tillägg till en arbetsflödestjänstvärd eller en arbetsflödesinstans. I följande kodexempel visas hur du utför de här stegen för en arbetsflödesinstans.
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);
Om du vill aktivera cachelagring när arbetsflödestjänsten har slutpunkter definierade i konfigurationen SendMessageChannelCache instansierar du klassen med hjälp av den parametriserade konstruktorn SendMessageChannelCache med parametern allowUnsafeCaching
inställd på true
. Lägg sedan till den nya instansen av den här klassen som ett tillägg till en arbetsflödestjänstvärd eller en arbetsflödesinstans. I följande kodexempel visas hur du aktiverar cachelagring för en arbetsflödesinstans.
SendMessageChannelCache customChannelCacheExtension =
new SendMessageChannelCache{ AllowUnsafeCaching = true };
clientInstance.Extensions.Add(customChannelCacheExtension);
Om du vill inaktivera cachen helt för kanalfabrikerna och kanalerna inaktiverar du kanalfabrikens cacheminne. Om du gör det inaktiveras även kanalcachen eftersom kanalerna ägs av deras motsvarande kanalfabriker. Om du vill inaktivera kanalfabrikscachen skickar du parametern factorySettings
SendMessageChannelCache till konstruktorn som initierats till en ChannelCacheSettings instans med MaxItemsInCache värdet 0. Följande kodexempel visar detta.
// 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);
Du kan välja att endast använda kanalfabrikens cacheminne och inaktivera kanalcachen genom att skicka parametern channelSettings
SendMessageChannelCache till konstruktorn som initierats till en ChannelCacheSettings instans med MaxItemsInCache värdet 0. Följande kodexempel visar detta.
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);
I en värdbaserad arbetsflödestjänst kan du ange inställningarna för fabrikscache och kanalcache i programkonfigurationsfilen. Det gör du genom att lägga till ett tjänstbeteende som innehåller cacheinställningarna för fabriks- och kanalcachen och lägga till det här tjänstbeteendet i din tjänst. I följande exempel visas innehållet i en konfigurationsfil som innehåller MyChannelCacheBehavior
tjänstbeteendet med inställningarna för anpassad fabrikscache och kanalcache. Det här tjänstbeteendet läggs till i tjänsten via attributet 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>