Mule 4.4本地部署:预加载Object Store缓存无法命中问题排查
Mule 4.4预加载缓存无法查询问题解决
问题场景
本地部署Mule 4.4环境,需求是从数据库加载静态员工数据到缓存,每24小时刷新。通过Scheduler流程预加载数据到Object Store,但HTTP查询流程始终无法命中缓存,返回"Not found in cache"日志。
Scheduler预加载流程代码
<flow name="load_cache" doc:id="8eaefe57-6de8-4d4f-97d5-fa181ea54b8b" > <scheduler doc:name="Scheduler" doc:id="b3fb9ce7-7254-481e-a137-d37ed1cc30a3" > <scheduling-strategy > <fixed-frequency /> </scheduling-strategy> </scheduler> <ee:transform doc:name="emp data from db" doc:id="b5d11958-3ea7-4596-9aed-51c616ae67f0" > <ee:message > <ee:set-payload ><![CDATA[%dw 2.0 output application/java --- [ { "id" : "001", "name": "John" }, { "id" : "002", "name" : "Jane" } ]]]></ee:set-payload> </ee:message> </ee:transform> <foreach doc:name="For Each" doc:id="da8ec47c-7b34-4707-ac78-6ffd433fb40b" > <os:store doc:name="Store" doc:id="d139954b-a4b7-4351-9463-8baccb5e2aba" key="#[payload.id]" objectStore="Object_store"> <os:value ><![CDATA[#[payload.name]]]></os:value> </os:store> </foreach> </flow>
HTTP查询流程代码
<flow name="header_pass_01Flow" doc:id="dc0c28a7-c277-4192-b641-e73af8afbde3" > <http:listener doc:name="Listener" doc:id="57e56cd6-a47e-456b-8c6d-e57627c673b8" path="/caching/*" config-ref="HTTP_Listener_config"/> <set-variable value='#["001"]' doc:name="get emp name for empId" doc:id="130a350e-d23b-41f6-86c3-fe8104b63d3f" variableName="id"/> <ee:cache doc:name="Cache" doc:id="a11f6da2-d24e-4a69-a0b1-647c0b6dfda8" cachingStrategy-ref="Caching_Strategy"> <logger level="INFO" doc:name="Logger" doc:id="fdeaaeff-06df-45d7-8c1f-410f343ae4e8" message="Not found in cache"/> </ee:cache> </flow>
基础配置代码
<http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config" doc:id="f1bec56d-de65-4a93-913d-07a7426d6bf6" > <http:listener-connection host="0.0.0.0" port="9091" /> </http:listener-config> <os:object-store name="Object_store" doc:name="Object store" doc:id="152be16e-2fd9-4d48-8310-3d6d45be4bff" maxEntries="10" entryTtl="2" entryTtlUnit="HOURS" /> <ee:object-store-caching-strategy name="Caching_Strategy" doc:name="Caching Strategy" doc:id="79383e4a-b907-450d-92c9-9d15b1efbb81" objectStore="Object_store" />
解决方案
1. 统一缓存键匹配
ee:cache组件默认使用当前payload作为缓存键,但你的流程中缓存键应该是员工ID(vars.id)。需要为ee:cache显式指定key属性,确保查询时使用的键和Scheduler存入的键一致:
<ee:cache doc:name="Cache" doc:id="a11f6da2-d24e-4a69-a0b1-647c0b6dfda8" cachingStrategy-ref="Caching_Strategy" key="#[vars.id]"> <!-- 缓存未命中时的逻辑:从Object Store读取数据 --> <os:retrieve doc:name="Retrieve Employee" key="#[vars.id]" objectStore="Object_store" defaultValue="Employee not found"/> <logger level="INFO" message="Not found in cache - retrieved from Object Store"/> </ee:cache>
2. 补充缓存组件的取值逻辑
原HTTP流程中ee:cache内部只有日志,没有实际获取缓存值的逻辑。添加<os:retrieve>组件,在缓存未命中时从Object Store读取数据(预加载的数据已存在,正常情况会直接命中缓存,不会执行内部逻辑)。
3. 修正Scheduler调度间隔
原fixed-frequency未设置间隔,默认1分钟刷新,不符合24小时刷新需求,修改为:
<scheduler doc:name="Scheduler" doc:id="b3fb9ce7-7254-481e-a137-d37ed1cc30a3" > <scheduling-strategy > <fixed-frequency frequency="24" timeUnit="HOURS"/> </scheduling-strategy> </scheduler>
4. 验证数据存入状态
在Scheduler流程的<foreach>中添加日志,确认数据成功存入Object Store:
<foreach doc:name="For Each" doc:id="da8ec47c-7b34-4707-ac78-6ffd433fb40b" > <os:store doc:name="Store" doc:id="d139954b-a4b7-4351-9463-8baccb5e2aba" key="#[payload.id]" objectStore="Object_store"> <os:value >#[payload.name]</os:value> </os:store> <logger level="INFO" message="Successfully stored employee: ID #[payload.id], Name #[payload.name]" /> </foreach>
验证步骤
- 启动Mule应用,观察Scheduler流程的日志,确认数据已存入Object Store。
- 发送HTTP请求到
http://localhost:9091/caching,第一次请求若缓存未命中会执行内部逻辑,后续请求应该直接命中缓存(不再打印"Not found in cache"日志)。
内容的提问来源于stack exchange,提问作者boomslaw
相关产品推荐
相关产品推荐

