2013-10-07 13 views
5

Sto cercando un modo per avere una cache condivisa su due server e sto studiando l'uso di Redis come strategia di memorizzazione degli oggetti-archivio, ma sto riscontrando un problema durante la lettura dei valori memorizzati.Strategia di caching del mulo usando Redis

Memorizza correttamente un valore quando l'hit della cache è un valore errato ma genera un errore durante il recupero del valore.

L'oggetto/proprietà richiesta "muleContext" è nullo

A occhio e sembra che l'oggetto-store-caching-strategia potrebbe aver bisogno di un negozio di oggetto che implementa l'interfaccia MuleContextAware.

Qualcuno sa se questo è corretto o come risolvere questo problema?

Ecco l'esempio flusso

<mule xmlns:redis="http://www.mulesoft.org/schema/mule/redis" xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" 
    xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd 
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
http://www.mulesoft.org/schema/mule/redis http://www.mulesoft.org/schema/mule/redis/3.4/mule-redis.xsd"> 


    <redis:config name="Redis" doc:name="Redis" defaultPartitionName="test" /> 
    <ee:object-store-caching-strategy name="Redis_Caching_Strategy" doc:name="Caching Strategy"> 
     <spring-object-store ref="Redis" /> 
    </ee:object-store-caching-strategy> 

    <flow name="htmlCacheRedisFlow" doc:name="htmlCacheRedisFlow"> 
     <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8084" path="cacheRedis" doc:name="HTTP"/> 
     <expression-transformer expression="#[payload.substring(payload.lastIndexOf('/') + 1)]" doc:name="Expression"/> 
     <ee:cache doc:name="Cache" cachingStrategy-ref="Redis_Caching_Strategy" > 
      <logger message="getting item from db for key #[payload]" level="INFO" doc:name="Logger"/> 
      <expression-transformer expression="#[payload + 'asd']" doc:name="Expression"/> 
     </ee:cache> 
    </flow> 
</mule> 
+0

Tenete a mente che, dal momento che si sta utilizzando la versione Enterprise Edition, è possibile contattare il supporto professionale di MuleSoft aiuto . Questa funzione non fa parte dell'edizione Community, quindi la community qui su StackOverflow potrebbe non essere in grado di aiutarti ... ma è un'ottima domanda :) –

+0

Ok, grazie, non mi rendevo conto che avevo ancora il runtime in studio per EE. Ora ho cambiato questo vedo che il caching non è più disponibile quindi la domanda non è più applicabile a me. – Stuart

risposta

1

Come già osservato da David, nei commenti questione, il campo di applicazione della cache EE non è disponibile nell'edizione comunità. Tuttavia ci sono modi per implementare il caching nella community edition.

Il post del blog Enterprise caching with Mule ESB Community Edition mostra come è possibile farlo aggiungendo un intercettore personalizzato. Il post del blog utilizza ehcache ma è possibile modificare questo esempio per utilizzare Redis.

Il post sul blog in breve è:

<custom-interceptor doc:name="PayloadCache" 
    class="se.redpill.mulecomponents.cache.PayloadCache"> 
    <spring:property name="cache" ref="MyCache"/> 
</custom-interceptor> 

e PayloadCache.java

package se.redpill.mulecomponents.cache; 
import net.sf.ehcache.Ehcache; 
import net.sf.ehcache.Element; 
import org.mule.DefaultMuleEvent; 
import org.mule.DefaultMuleMessage; 
import org.mule.api.MuleEvent; 
import org.mule.api.MuleException; 
import org.mule.api.MuleMessage; 
import org.mule.api.interceptor.Interceptor; 
import org.mule.api.processor.MessageProcessor; 
/** 
* A mule interceptor acting as a ehCache component. 
* Based on the Cache interceptor blueprint from Mule In Action by David Dossot and John D'Emic, 
* 
*/ 
public class PayloadCache implements Interceptor 
{  
     private MessageProcessor next; 
     private Ehcache cache; 
     public void setListener(MessageProcessor listener) 
     { 
     next = listener; 
     } 
     public void setCache(final Ehcache cache) 
     { 
     this.cache = cache; 
     } 
     public MuleEvent process(MuleEvent event) throws MuleException 
     { 
     final MuleMessage currentMessage = event.getMessage(); 
     final Object key = currentMessage.getPayload(); 
     final Element cachedElement = cache.get(key); 
     if (cachedElement != null) 
     { 
      return new DefaultMuleEvent(new DefaultMuleMessage(cachedElement.getObjectValue(), 
      currentMessage, event.getMuleContext()), event); 
     } 
     final MuleEvent result = next.process(event); 
     cache.put(new Element(key, result.getMessage().getPayload())); 
     return result; 
     } 
} 
+0

come modificare questo esempio per usare Mongodb? – user2016

Problemi correlati