Escribir mandatos para la invalidación basada en mandatos

Para permitir que una llamada de mandato sea interceptada por la memoria caché dinámica, el mandato debe escribirse en la infraestructura de mandatos de WebSphere con la clase de implementación que se extiende desde CacheableCommandImpl (en el paquete com.ibm.websphere.command). Para simplificar la escritura de mandatos de la invalidación basada en mandatos, HCL Commerce ha actualizado las clases abstractas, ControllerCommandImpl y TaskCommandImpl, para que se extiendan desde CacheableCommandImpl de forma que cualquier mandato que se extienda desde estas clases abstractas también se extienda desde CacheableCommandImpl y que, por consiguiente, se pueda elegir para la invalidación basada en mandatos.

Por qué y cuándo se efectúa esta tarea

Al escribir estos mandatos, también es importante saber cuáles van a ser los ID de invalidación y comprender las normas de invalidación que interceptan llamadas a los mandatos. Puesto que los ID de invalidación se generan basándose en métodos y campos presentes en el mandato como parámetros de entrada, todos los métodos que se necesitan para construir los ID de invalidación deben proporcionarse en la interfaz de mandatos e implementarse.

Ejemplo de utilización de la invalidación de mandatos en HCL Commerce

El ejemplo siguiente muestra cómo HCL Commerce utiliza la invalidación de mandatos. Cuando el mandato DeleteMemberGroupMemberCmdImpl, que suprime un miembro específico que pertenece a un grupo de miembros particular, se ejecuta satisfactoriamente, la memoria caché dinámica invalidará la entrada de memoria caché definida en la norma de invalidación. En este ejemplo, se define como "DC_userId: userId ", donde userId es el valor que devuelve el método getMemberId. Por ejemplo, DC_userId:-1000, DC_userId:-1001, y así sucesivamente. Este mandato tiene un método get, getMemberId(), que recupera el ID de usuario que se está suprimiendo y este método se utiliza para calcular qué entradas de memoria caché con un ID de dependencia basado en un ID de usuario se suprimen. La misma lógica se aplica al mandato AddMemberGroupMemberCmdImpl que también tiene un método get, 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>
Nota: Todas las normas de invalidación anteriores se envían con HCL Commerce en la política de memoria caché de ejemplo. Puede encontrar más normas de invalidación de ejemplo en el directorio de instalación de HCL Commerce bajo el subdirectorio /samples/dynacache/invalidation. Consulte el archivo README titulado "Políticas de memoria caché de invalidación de ejemplo para Dynacache" para obtener más información sobre cómo incorporar las normas de invalidación en el archivo cachespec.xml.

Ejemplo de invalidación de memoria caché

El ejemplo siguiente muestra cómo configurar políticas de almacenamiento en memoria caché en el archivo cachespec.xml para almacenar en memoria caché la página JSP ProductDisplay del modelo de negocio B2C en HCL Commerce y cómo invalidar la entrada de memoria caché mediante la definición de las normas de invalidación en el mismo archivo XML. El ejemplo define varios ID de dependencia junto con la norma de generación de ID de memoria caché para el archivo JSP. Cada ID de dependencia se utiliza para invalidar la entrada de memoria caché cuando ésta se actualiza bajo distintas circunstancias. Este ejemplo solo muestra un subconjunto de las políticas necesarias para invalidar la JSP CachedProductDisplay. Para obtener un ejemplo completo e información detallada, consulte el archivo README en el directorio 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>