2016-05-27 9 views
0

Ich möchte nicht serialisierbaren Objekt zu Camel-Cache und erhalten. In der Routenkonfiguration des Caches setze ich den Parameter objectCache wie unten gezeigt auf true.Apache Camel Cache-Konfiguration funktioniert nicht

from("cache://MyCache" 
      + "?maxElementsInMemory=5" + 
      "&memoryStoreEvictionPolicy=" + 
      "MemoryStoreEvictionPolicy.FIFO" + 
      "&overflowToDisk=false" + 
      "&timeToLiveSeconds=300" + 
      "&objectCache=true" + 
      "&diskExpiryThreadIntervalSeconds=30").to("mock:endpoint"); 

Es gibt kein Problem beim Einfügen in den Cache mit folgendem Code.

from("direct:addToCache").process(new Processor() { 
      @Override 
      public void process(Exchange exchange) throws Exception { 
       MyObject ad = (MyObject) exchange.getIn().getBody(); 
       String key= ad.getId(); 
       WebServiceResponse value= ad.getWebServiceResponse(); 
       exchange.getIn().setHeader(CacheConstants.CACHE_OPERATION, CacheConstants.CACHE_OPERATION_ADD); 
       exchange.getIn().setHeader(CacheConstants.CACHE_KEY, key); 
       exchange.getIn().setBody(value); 
      } 
     }).to("cache://MyCache"); 

Aber beim Abrufen Element aus dem Cache folgenden Ausnahme ausgelöst.

org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: com.aaa.model.WebServiceResponse to the required type: java.io.InputStream with value [email protected] 
at org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:185) 
at org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:156) 
at org.apache.camel.component.cache.CacheProducer.createElementFromBody(CacheProducer.java:132) 
at org.apache.camel.component.cache.CacheProducer.performCacheOperation(CacheProducer.java:82) 
at org.apache.camel.component.cache.CacheProducer.process(CacheProducer.java:71) 
at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) 
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:141) 
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) 
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:460) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:121) 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) 
at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) 
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109) 
at org.apache.camel.processor.UnitOfWorkProducer.process(UnitOfWorkProducer.java:68) 
at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:412) 
at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:380) 
at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:270) 
at org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:380) 

Während CacheProducerClass.createElementFromBody Verfahren Debugging, merke ich, dass Object Parameter als unwahr gesetzt. Alle anderen Parameter werden als die Default-Werte festgelegt. (MaxElementsInMemory = 1000 und memoryStoreEvictionPolicy = MemoryStoreEvictionPolicy.LFU)

com.aaa.model.WebServiceResponse-Klasse ist nicht serialisierbar.

Haben Sie eine Idee zu diesem Problem? Warum Cache-Parameter nicht mit den Werten in der Cache-Definition überschrieben werden?

Antwort

1

Ich habe das gleiche Problem, weiß nicht warum, wenn ein Element zum Cache hinzugefügt wird, werden alle Parameter auf Standardwerte zurückgesetzt.

Die Lösung, die ich als Workaround gefunden habe, besteht darin, alle Parameter und ihre Werte erneut anzugeben, wenn Sie ein Element hinzufügen.

Zum Beispiel, wenn Sie Ihren Code zu den folgenden ändern, sollte es funktionieren.

from("direct:addToCache").process(new Processor() { 
      @Override 
      public void process(Exchange exchange) throws Exception { 
       MyObject ad = (MyObject) exchange.getIn().getBody(); 
       String key= ad.getId(); 
       WebServiceResponse value= ad.getWebServiceResponse(); 
       exchange.getIn().setHeader(CacheConstants.CACHE_OPERATION, CacheConstants.CACHE_OPERATION_ADD); 
       exchange.getIn().setHeader(CacheConstants.CACHE_KEY, key); 
       exchange.getIn().setBody(value); 
      } 
     }).to("cache://MyCache" 
      + "?maxElementsInMemory=5" + 
      "&memoryStoreEvictionPolicy=" + 
      "MemoryStoreEvictionPolicy.FIFO" + 
      "&overflowToDisk=false" + 
      "&timeToLiveSeconds=300" + 
      "&objectCache=true" + 
      "&diskExpiryThreadIntervalSeconds=30").to("mock:endpoint");