在 Mule 中使用 mysql 配置 EHCache
configure the EHCache with mysql in Mule
在 mule 中,我将 MySQL 数据库连接器包装在一个缓存范围内,并配置了一个自定义缓存策略,即 EHCache。
因此,每当有对缓存范围的重复请求时,它应该return 存储在其缓存中的数据。但它并没有那样工作。所以,我经历了这个 post
How to configure the EHCache with CXF in Mule
根据建议,我将我的代码分成两部分,并在缓存范围的请求和响应中使用 VM 和对象到字符串转换器
<spring:beans>
<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="120"/>
<spring:property name="timeToLive" value="120"/>
<spring:property name="overflowToDisk" value="true"/>
<spring:property name="maxElementsOnDisk" value="10000000"/>
<spring:property name="diskPersistent" value="false"/>
<spring:property name="diskExpiryThreadIntervalSeconds" value="120"/>
<spring:property name="memoryStoreEvictionPolicy" value="LRU"/>
</spring:bean>
</spring:beans>
<ee:object-store-caching-strategy name="Caching_Strategy" doc:name="Caching Strategy">
<custom-object-store class="com.lineage.cache.EhcacheObjectStore">
<spring:property name="cache" ref="cache"/>
</custom-object-store>
</ee:object-store-caching-strategy>
<flow name="highjumpdummyFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/>
<ee:cache doc:name="Cache" cachingStrategy-ref="Caching_Strategy">
<logger message="#['Into the Cache Block']" level="INFO" doc:name="Logger"/>
<vm:outbound-endpoint exchange-pattern="request-response" path="DBCache" connector-ref="VM" doc:name="VM">
<vm:transaction action="ALWAYS_BEGIN"/>
</vm:outbound-endpoint>
</ee:cache>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
</flow>
<flow name="highjump_dummyFlow1">
<vm:inbound-endpoint exchange-pattern="one-way" path="DBCache" connector-ref="VM" doc:name="VM">
<vm:transaction action="ALWAYS_BEGIN"/>
</vm:inbound-endpoint>
<db:select config-ref="MySQL_Configuration" doc:name="Database">
<db:dynamic-query><![CDATA[select * from HIGHJUMP_INVOICE_CHARGE_STAGING;]]></db:dynamic-query>
</db:select>
<data-mapper:transform config-ref="Map_To_XML" doc:name="Map To XML"/>
<byte-array-to-object-transformer doc:name="Byte Array to Object"/>
<object-to-string-transformer doc:name="Object to String"/>
</flow>
但是现在,我遇到了一个新问题。在我在数据库连接器的第二个流程中,骡子流程失败了
org.mule.api.MessagingException: 无法将连接绑定到当前事务: org.mule.transport.vm.VMTransaction@90b65fe0-e408-11e4-ae24-d43d7e1497b8[status=STATUS_ACTIVE, key=null, resource=null] (org.mule.module.db.internal.domain.connection.ConnectionBindingException).消息负载的类型为:String
控制台消息:
根异常堆栈跟踪:
org.mule.transaction.IllegalTransactionStateException:只能绑定"QueueManager/QueueSession"类型的资源
在 org.mule.transport.vm.VMTransaction.bindResource(VMTransaction.java:41)
在 org.mule.module.db.internal.domain.connection.TransactionalDbConnectionFactory.getConnectionFromTransaction(TransactionalDbConnectionFactory.java:110)
在 org.mule.module.db.internal.domain.connection.TransactionalDbConnectionFactory.createConnection(TransactionalDbConnectionFactory.java:72)
+ 3 个(设置调试级别日志记录或 '-Dmule.verbose.exceptions=true' 一切)
请删除导致问题的 VM 中的 transaction 部分,并按照此处给出的相同操作进行操作:-
http://blogs.mulesoft.org/guest-post-exposing-cxf-webservice-mule-cache/
并且还放
<object-to-string-transformer doc:name="Object to String"/>
在缓存块之前使负载可缓存
而且老实说,你可以直接把Database组件直接放在Cache scope下面,而不用把flow分成2份。它会工作..
在 mule 中,我将 MySQL 数据库连接器包装在一个缓存范围内,并配置了一个自定义缓存策略,即 EHCache。
因此,每当有对缓存范围的重复请求时,它应该return 存储在其缓存中的数据。但它并没有那样工作。所以,我经历了这个 post How to configure the EHCache with CXF in Mule
根据建议,我将我的代码分成两部分,并在缓存范围的请求和响应中使用 VM 和对象到字符串转换器
<spring:beans>
<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="120"/>
<spring:property name="timeToLive" value="120"/>
<spring:property name="overflowToDisk" value="true"/>
<spring:property name="maxElementsOnDisk" value="10000000"/>
<spring:property name="diskPersistent" value="false"/>
<spring:property name="diskExpiryThreadIntervalSeconds" value="120"/>
<spring:property name="memoryStoreEvictionPolicy" value="LRU"/>
</spring:bean>
</spring:beans>
<ee:object-store-caching-strategy name="Caching_Strategy" doc:name="Caching Strategy">
<custom-object-store class="com.lineage.cache.EhcacheObjectStore">
<spring:property name="cache" ref="cache"/>
</custom-object-store>
</ee:object-store-caching-strategy>
<flow name="highjumpdummyFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/>
<ee:cache doc:name="Cache" cachingStrategy-ref="Caching_Strategy">
<logger message="#['Into the Cache Block']" level="INFO" doc:name="Logger"/>
<vm:outbound-endpoint exchange-pattern="request-response" path="DBCache" connector-ref="VM" doc:name="VM">
<vm:transaction action="ALWAYS_BEGIN"/>
</vm:outbound-endpoint>
</ee:cache>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
</flow>
<flow name="highjump_dummyFlow1">
<vm:inbound-endpoint exchange-pattern="one-way" path="DBCache" connector-ref="VM" doc:name="VM">
<vm:transaction action="ALWAYS_BEGIN"/>
</vm:inbound-endpoint>
<db:select config-ref="MySQL_Configuration" doc:name="Database">
<db:dynamic-query><![CDATA[select * from HIGHJUMP_INVOICE_CHARGE_STAGING;]]></db:dynamic-query>
</db:select>
<data-mapper:transform config-ref="Map_To_XML" doc:name="Map To XML"/>
<byte-array-to-object-transformer doc:name="Byte Array to Object"/>
<object-to-string-transformer doc:name="Object to String"/>
</flow>
但是现在,我遇到了一个新问题。在我在数据库连接器的第二个流程中,骡子流程失败了 org.mule.api.MessagingException: 无法将连接绑定到当前事务: org.mule.transport.vm.VMTransaction@90b65fe0-e408-11e4-ae24-d43d7e1497b8[status=STATUS_ACTIVE, key=null, resource=null] (org.mule.module.db.internal.domain.connection.ConnectionBindingException).消息负载的类型为:String
控制台消息: 根异常堆栈跟踪: org.mule.transaction.IllegalTransactionStateException:只能绑定"QueueManager/QueueSession"类型的资源 在 org.mule.transport.vm.VMTransaction.bindResource(VMTransaction.java:41) 在 org.mule.module.db.internal.domain.connection.TransactionalDbConnectionFactory.getConnectionFromTransaction(TransactionalDbConnectionFactory.java:110) 在 org.mule.module.db.internal.domain.connection.TransactionalDbConnectionFactory.createConnection(TransactionalDbConnectionFactory.java:72) + 3 个(设置调试级别日志记录或 '-Dmule.verbose.exceptions=true' 一切)
请删除导致问题的 VM 中的 transaction 部分,并按照此处给出的相同操作进行操作:-
http://blogs.mulesoft.org/guest-post-exposing-cxf-webservice-mule-cache/
并且还放
<object-to-string-transformer doc:name="Object to String"/>
在缓存块之前使负载可缓存
而且老实说,你可以直接把Database组件直接放在Cache scope下面,而不用把flow分成2份。它会工作..