gpt4 book ai didi

使用 Redis 的 Mule 缓存策略

转载 作者:行者123 更新时间:2023-12-04 21:43:42 25 4
gpt4 key购买 nike

我正在寻找一种在两台服务器之间共享缓存的方法,并且我正在研究使用 Redis 作为对象存储缓存策略,但是在读取存储值时遇到了问题。

当缓存命中为未命中值时,它成功存储了一个值,但在检索该值时抛出了错误。

The required object/property "muleContext" is null



猜测似乎 object-store-caching-strategy 可能需要一个实现 MuleContextAware 接口(interface)的对象存储。

有谁知道这是否正确或如何解决此问题?

这是示例流程
    <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>

最佳答案

正如大卫已经指出的那样,在问题评论中,EE 缓存范围在社区版中不可用。但是,有一些方法可以在社区版中实现缓存。

博文Enterprise caching with Mule ESB Community Edition展示了如何通过添加自定义拦截器来做到这一点。博客文章使用 ehcache,但您可以修改此示例以改用 Redis。

简而言之,博客文章是:

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

和 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;
}
}

关于使用 Redis 的 Mule 缓存策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19221828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com