2013-10-07 10 views
5

Szukam sposobu na udostępnianie pamięci podręcznej na dwóch serwerach i badam wykorzystanie Redis jako strategii buforowania magazynu obiektów, ale napotykam problem podczas odczytywania zapisanych wartości.Strategia buforowania Mule za pomocą Redis

Pomyślnie zapisuje wartość, gdy trafienie w pamięci podręcznej jest wartością miss, ale generuje błąd podczas pobierania wartości.

Wymagany obiekt/nieruchomość „muleContext” jest zerowy

na oko wydaje się, że obiekt-store-buforowania-strategii mogą potrzebować sklep obiektu, który implementuje interfejs MuleContextAware.

Czy ktoś wie, czy jest to poprawne i jak rozwiązać ten problem?

Oto przykład płynąć

<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

Należy pamiętać, że skoro używasz Enterprise Edition, można skontaktować się z profesjonalną obsługę MuleSoft o pomoc . Ta funkcja nie jest częścią edycji społecznościowej, więc społeczność tutaj w StackOverflow może nie być w stanie Ci pomóc ... ale to świetne pytanie :) –

+0

Ok, dzięki, nie zdawałem sobie sprawy, że wciąż mam środowisko uruchomieniowe w studio ustawione na EE. Teraz to zmieniłem. Widzę, że buforowanie nie jest już dostępne, więc pytanie nie ma już dla mnie zastosowania. – Stuart

Odpowiedz

1

Jak już wspomniano przez Dawida w komentarzach pytanie zakres EE cache nie jest dostępny w wersji społeczności. Istnieją jednak sposoby na wdrożenie buforowania w edycji społeczności.

Wpis na blogu Enterprise caching with Mule ESB Community Edition pokazuje, jak to zrobić, dodając niestandardowy przechwytywacz. W poście na blogu jest używany ehcache, ale możesz zmodyfikować ten przykład, aby zamiast niego korzystać z usługi Redis.

blogu w skrócie brzmi:

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

i 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

Jak zmodyfikować ten przykład, aby użyć Mongodb? – user2016

Powiązane problemy