Ecriture d'instructions pour l'invalidation basée sur les instructions

Pour qu'un appel d'instruction soit intercepté par le cache dynamique, vous devez écrire l'instruction dans la structure d'instructions WebSphere et indiquer une classe d'implémentation débutant à CacheableCommandImpl (dans le module com.ibm.websphere.command). Pour simplifier l'écriture d'instructions destinées à l'invalidation basée sur les instructions, HCL Commerce fait désormais démarrer les classes abstraites, ControllerCommandImpl et TaskCommandImpl à CacheableCommandImpl afin que toute instruction partant de ces classes abstraites débute également à CacheableCommandImpl et puisse dont être utilisée pour l'invalidation basée sur les instructions.

Pourquoi et quand exécuter cette tâche

Lors de l'écriture d'instructions de ce type, il est également important de connaître les ID d'invalidation et de comprendre les règles d'invalidation qui interceptent les appels d'instructions. Dans la mesure où les ID d'invalidation sont créés en fonction de méthodes et de zones figurant dans l'instruction sous forme de paramètres d'entrée, toutes les méthodes requises pour construire les ID d'invalidation doivent être précisées dans l'interface de l'instruction et mises en oeuvre.

Exemple d'utilisation de l'invalidation d'une instruction dans HCL Commerce

L'exemple suivant illustre comment HCL Commerce utilise l'invalidation d'instruction. Lorsque l'instruction DeleteMemberGroupMemberCmdImpl qui supprime un membre donné appartenant à un groupe de membres spécifique est exécutée correctement, la mémoire cache dynamique invalide l'entrée de cache définie dans la règle d'invalidation. Dans cet exemple, elle est définie comme "DC_userId: userId ", où userId est la valeur renvoyée de la méthode getMemberId. Par exemple, DC_userId:-1000, DC_userId:-1001 et ainsi de suite. Cette instruction comporte une méthode d'extraction, getMemberId(), qui permet d'obtenir l'ID utilisateur en cours de suppression et de calculer quelles entrées de cache dont l'ID de dépendance est basé sur un ID utilisateur sont supprimées. La même logique s'applique à l'instruction AddMemberGroupMemberCmdImpl qui comporte également la méthode d'extraction getMemberId() :


<cache-entry>
      <class>command</class>
     
<name>com.ibm.commerce.membergroup.commands.AddMemberGroupMemberCmdImpl</name>
     
<name>com.ibm.commerce.membergroup.commands.DeleteMemberGroupMemberCmdImpl</name>
                
      <invalidation>DC_userId
          <component type="method"id="getMemberId">
               <required>true</required>
          </component>
      </invalidation>
</cache-entry>
Remarque : Toutes les règles d'invalidation ci-dessus sont livrées avec HCL Commerce dans le modèle de stratégie de mise en mémoire cache. D'autres exemples de règles d'invalidation sont disponibles dans le répertoire d'installation de HCL Commerce, dans le sous-répertoire /samples/dynacache/invalidation. Consultez le fichier README intitulé "Exemples de stratégies d'invalidation en mémoire cache pour Dynacache" pour plus d'informations sur l'intégration des règles d'invalidation dans le fichier cachespec.xml.

Exemple d'invalidation en mémoire cache

L'exemple suivant montre comment définir les stratégies de mise en cache dans le fichier cachespec.xml pour mettre en cache la page JSP ProductDisplay du modèle de gestion B2C de HCL Commerce et comment invalider l'entrée de mémoire cache en définissant les règles d'invalidation dans le même fichier XML. Cet exemple définit les ID de dépendance ainsi que la règle de création de l'ID du cache pour le fichier JSP. Chaque ID d'indépendance permet d'invalider l'entrée de cache lorsqu'elle est mise à jour dans différents cas. Cet exemple montre uniquement un sous-ensemble de stratégies nécessaires à l'invalidation de la page JSP CachedProductDisplay. Pour un exemple complet et des informations détaillées, voir le fichier README dans le répertoire WCDE_installdir/samples/dynacache/invalidation.


<cache>

   <cache-entry>
       <class>servlet</class>
      
<name>/ConsumerDirect/ShoppingArea/CatalogSection/CatalogEntrySubsection/CachedProductDisplay.jsp</name>
       <property
name="save-attributes">false</property>

       <!-- Cache ProductDisplay.jsp -->     
       <cache-id>
           <component  id="storeId" type="parameter">
                  <required>true</required>
           </component>
           <component  id="catalogId" type="parameter">
                  <required>true</required>
           </component>
           <component  id="productId" type="parameter">
                       <required>true</required>
           </component>
           <component  id="DC_lang" type="attribute">
                  <required>true</required>
           </component>
           <component  id="DC_curr" type="attribute">
                  <required>true</required>
           </component>
           <component  id="DC_porg" type="attribute">
                  <required>true</required>
           </component>
           <component  id="DC_cont" type="attribute">
                  <required>true</required>
           </component>
           <component  id="DC_mg" type="attribute">
                  <required>true</required>
           </component>
       </cache-id>
               
                    
       <!-- Used for invalidating the product display cache
entry -->
       <!-- that belongs to a specific store                    
 -->        
       <dependency-id>storeId
           <component id="storeId" type="parameter">
                  <required>true</required>
           </component>
       </dependency-id>
        
       <!-- Used for invalidating the cache entry of a specific
product -->  
       <dependency-id>productId
            <component id="productId" type="parameter">
                 <required>true</required>
            </component>
        </dependency-id>

       <!-- Used for invalidating the product display cache
entry -->
       <!-- that belongs to a specific catalog in the store     
 -->        
       <dependency-id>storeId:catalogId
                <component id="storeId" type="parameter">
                        <required>true</required>
            </component>
            <component id="catalogId" type="parameter">
                 <required>true</required>
            </component>
        </dependency-id>
                  
       <!-- Used for invalidating the product display cache
entry -->
       <!-- that is under a specific contract                   
 --> 
       <dependency-id>contractId
            <component id="DC_cont0" type="attribute">
                 <required>true</required>
            </component>
       </dependency-id>
   
   </cache-entry>
        
   <cache-entry>
        <class>command</class>
        <sharing-policy>not-shared</sharing-policy>
       
<name>com.ibm.commerce.catalogmanagement.commands.AddCatalogDescCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.UpdateCatalogDescCmdImpl</name>
                
        <!--
********************************************************* -->
        <!-- Invalidate all the product page cache entries that 
      -->
        <!-- might be affected when the catalog description is
changed -->
        <!--
********************************************************* -->   
        <invalidation>storeId:catalogId
        <component  id="getStoreId" type="method">
           <required>true</required>
        </component>
        <component  id="getCatalogId" type="method">
           <required>true</required>
        </component>
        </invalidation>
         
   </cache-entry>    
        
   <cache-entry>
        <class>command</class>
        <sharing-policy>not-shared</sharing-policy>
       
<name>com.ibm.commerce.catalogmanagement.commands.ListpriceAddCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.ListpriceDeleteCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.ListpriceUpdateCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.OfferAddCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.OfferDeleteCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.OfferUpdateCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.ProductAttributeUpdateCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.AttributeValueUpdateCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.AddListpriceCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.DeleteListpriceCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.UpdateListpriceCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.AddOfferCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.DeleteOfferCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.UpdateOfferCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.UpdateAttributeCmdImpl</name>
       
<name>com.ibm.commerce.catalogmanagement.commands.UpdateAttributeValueCmdImpl</name>

        <!--
********************************************************* -->
        <!-- Invalidate the specific product page cache entry
when the -->
        <!-- product is updated                                 
      -->
        <!--
********************************************************* -->   
        <invalidation>productId
           <component id="getCatentryId" type="method">
                 <required>true</required>
           </component>
        </invalidation>
                     
   </cache-entry>            
         
   <cache-entry>
      <class>command</class>
      <sharing-policy>not-shared</sharing-policy>
     
<name>com.ibm.commerce.contract.commands.ContractSuspendCmdImpl</name>
     
<name>com.ibm.commerce.contract.commands.ContractTCDeployCmdImpl</name>

      <!--
********************************************************* -->
      <!-- Invalidate all the product page cache entries under a
    -->
      <!-- specific contract                                    
    -->
      <!--
********************************************************* -->
      <invalidation>contractId
         <component  id="getContractId" type="method">
            <required>true</required>
         </component>
      </invalidation>
   </cache-entry>
                
   <cache-entry>
      <class>command</class>
     
<name>com.ibm.commerce.tools.devtools.store.commands.StoreProfileUpdateCmdImpl</name>
     
<name>com.ibm.commerce.tools.devtools.flexflow.ui.commands.impl.FlexflowUpdateCmdImpl</name>
     
<name>com.ibm.commerce.store.commands.StoreOpenCmdImpl</name>
     
<name>com.ibm.commerce.store.commands.StoreCloseCmdImpl</name>
        
      <!--
********************************************************* -->   
 
      <!-- Invalidate all the product page cache entries that   
    -->
      <!-- belong to the store when the store is updated        
    -->
      <!--
********************************************************* -->   
 
      <invalidation>storeId
         <component  id="getStoreId" type="method">
              <required>true</required>
         </component>
      </invalidation>
                                
   </cache-entry>
        
                
   <cache-entry>
        <class>command</class>
        <sharing-policy>not-shared</sharing-policy>
       
<name>com.ibm.commerce.catalogimport.commands.CatalogImportJobAddCmd</name>

        <!--
********************************************************* -->   
        <!-- Invalidate all the product page cache entries that 
      -->
        <!-- belong to the store when the store catalog is
updated     -->
        <!--
********************************************************* -->   
        <invalidation>storeId
           <component  id="getStoreId" type="method">
               <required>true</required>
           </component>
        </invalidation>
   </cache-entry>

</cache>