我有一个SOAP Web服务如下: -
<spring:bean id="cacheManager" name="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>
<spring:bean id="cache" name="cache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<spring:property name="cacheManager" ref="cacheManager"/>
<spring:property name="cacheName" value="dbCache"/>
<spring:property name="maxElementsInMemory" value="10000"/>
<spring:property name="eternal" value="false"/>
<spring:property name="timeToIdle" value="${timeToIdle}"/>
<spring:property name="timeToLive" value="${timeToLive}"/>
<spring:property name="overflowToDisk" value="true"/>
<spring:property name="maxElementsOnDisk" value="10000000"/>
<spring:property name="diskPersistent" value="false"/>
<spring:property name="diskExpiryThreadIntervalSeconds" value="5"/>
<spring:property name="memoryStoreEvictionPolicy" value="LRU"/>
<!-- Cache Expiry -->
</spring:bean>
</spring:beans>
<ee:object-store-caching-strategy name="cachingStrategy" doc:name="cachingStrategy">
<custom-object-store class="com.anirban.EHCatche.EhcacheObjectStore">
<spring:property name="cache" ref="cache"/>
</custom-object-store>
</ee:object-store-caching-strategy>
<!-- Catch Strategy ends -->
<flow name="ServiceFlow" doc:name="ServiceFlow">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" path="mainData" doc:name="HTTP" />
<ee:cache doc:name="Cache" cachingStrategy-ref="cachingStrategy">
<cxf:jaxws-service serviceClass="com.test.services.schema.maindata.v1.MainData" doc:name="SOAP"/>
<component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl" doc:name="JavaMain_ServiceImpl"/>
</ee:cache>
</flow>
现在您可以看到..我已将cxf:jaxws-service
和component class
包裹在ee:cache
块下..
Webservice从DB中获取一组数据
我的主要目的是,如果我触发web服务,它将从第一次从DB获取数据,然后针对相同的请求,它将从缓存中获取特定时间...如果我触发服务与不同的请求它将再次从DB获取数据,然后从缓存中检索后续相同的请求。
它会将数据保存在缓存中一段时间..
现在问题是如果我触发服务..它总是从数据库中获取数据并且它没有在缓存中保存相同请求的任何数据。 每次我点击服务时它都直接命中数据库,并且不会从缓存中获取相同请求的数据。 请帮助..如何在Mule中使用CXF配置缓存
答案 0 :(得分:2)
使用VM端点并将请求和响应序列化为字符串,将服务流分为两部分。这将使事件可以缓存。
<flow name="ServiceFlow" doc:name="ServiceFlow">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" path="mainData" doc:name="HTTP" />
<object-to-string-transformer />
<ee:cache doc:name="Cache" cachingStrategy-ref="cachingStrategy">
<vm:outbound-endpoint path="cxf.service" exchange-pattern="request-response" />
<object-to-string-transformer />
</ee:cache>
</flow>
<flow name="CXFFlow" doc:name="CXFFlow">
<vm:inbound-endpoint path="cxf.service" exchange-pattern="request-response" />
<cxf:jaxws-service serviceClass="com.test.services.schema.maindata.v1.MainData" doc:name="SOAP"/>
<component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl" doc:name="JavaMain_ServiceImpl"/>
</flow>
答案 1 :(得分:0)
所以,最终解决方案正如大卫建议的那样,将流程分成两部分并使用<object-to-string-transformer />
来序列化请求和响应,这对于执行缓存非常重要