Dela via


Ä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 factorySettingsSendMessageChannelCache 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 channelSettingsSendMessageChannelCache 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>