Ehcache,具有JMS复制和activemq的CacheException

时间:2014-04-22 19:07:42

标签: spring hibernate jms activemq ehcache

我正在尝试使用JMS复制实现带有ehcache的hibernate集群二级缓存。 Hibernate版本是3.6.10.final,spring版本是3.2.2。

当servlet启动时,我收到以下错误:

Caused by: org.hibernate.cache.CacheException: net.sf.ehcache.CacheException: Failure cloning default cache. Initial cause was not supported
at net.sf.ehcache.hibernate.AbstractEhcacheProvider.buildCache(AbstractEhcacheProvider.java:73)
at org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge.buildEntityRegion(RegionFactoryCacheProviderBridge.java:104)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:280)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)
at com.targa.fleetGateway.HibernateUtil.<init>(HibernateUtil.java:26)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
... 73 more
Caused by: net.sf.ehcache.CacheException: Failure cloning default cache. Initial cause was not supported
at net.sf.ehcache.CacheManager.cloneDefaultCache(CacheManager.java:1877)
at net.sf.ehcache.CacheManager.addCache(CacheManager.java:1173)
at net.sf.ehcache.hibernate.AbstractEhcacheProvider.buildCache(AbstractEhcacheProvider.java:66)
... 82 more
Caused by: java.lang.CloneNotSupportedException: not supported
at net.sf.ehcache.distribution.jms.JMSCacheLoader.clone(JMSCacheLoader.java:269)
at net.sf.ehcache.Cache.clone(Cache.java:2846)
at net.sf.ehcache.Cache.clone(Cache.java:163)
at net.sf.ehcache.CacheManager.cloneDefaultCache(CacheManager.java:1875)
... 84 more

我的ehcache.xml是:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true">

   <cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.jms.JMSCacheManagerPeerProviderFactory"
properties="initialContextFactoryName=com.targa.fleetGateway.ExampleActiveMQInitialContextFactory, 
providerURL=tcp://127.0.0.1:61616,   replicationTopicConnectionFactoryBindingName=topicConnectionFactory, 
replicationTopicBindingName=ehcache, getQueueConnectionFactoryBindingName=queueConnectionFactory, getQueueBindingName=ehcacheGetQueue,  topicConnectionFactoryBindingName=topicConnectionFactory,  topicBindingName=ehcache" 
propertySeparator="," />

   <defaultCache 
maxElementsInMemory="100" 
eternal="false" 
timeToIdleSeconds="300" 
timeToLiveSeconds="600" 
overflowToDisk="false">

      <cacheEventListenerFactory class="net.sf.ehcache.distribution.jms.JMSCacheReplicatorFactory" 
properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, 
replicateUpdatesViaCopy=true, replicateRemovals=true, asynchronousReplicationIntervalMillis=1000" 
propertySeparator="," />

      <cacheLoaderFactory class="net.sf.ehcache.distribution.jms.JMSCacheLoaderFactory"
properties="initialContextFactoryName=com.targa.fleetGateway.ExampleActiveMQInitialContextFactory, 
providerURL=tcp://127.0.0.1:61616,   replicationTopicConnectionFactoryBindingName=topicConnectionFactory,
getQueueConnectionFactoryBindingName=queueConnectionFactory,   replicationTopicBindingName=ehcache,   
getQueueBindingName=ehcacheGetQueue,  timeoutMillis=10000" />

   </defaultCache>

</ehcache>

如果我注释掉cacheLoaderFactory部分,事情就会重新开始。 相同的配置适用于我使用hibernate 4.2的另一个应用程序,但我无法升级到4.2。

有人对此有任何疑问吗?

以下是我配置的其他相关部分。如果有任何遗漏,请告诉我。

的pom.xml

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>3.6.10.Final</version>
</dependency>

<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.8</version>
</dependency>

<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-jmsreplication</artifactId>
<version>0.5</version>
</dependency>

<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>16.0.1</version>
</dependency>

Hibernate属性:

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.provider_class">
net.sf.ehcache.hibernate.SingletonEhCacheProvider</property>

ExampleActiveMQInitialContextFactory.java

public class ExampleActiveMQInitialContextFactory extends
ActiveMQInitialContextFactory {

    /**
    * {@inheritDoc}
    */
    @Override
    public Context getInitialContext(Hashtable environment) throws NamingException {

        Map&lt;String, Object&gt; data = new ConcurrentHashMap&lt;String, Object&gt;();

        String replicationTopicConnectionFactoryBindingName = (String) environment
        .get(JMSUtil.TOPIC_CONNECTION_FACTORY_BINDING_NAME);
        if (replicationTopicConnectionFactoryBindingName != null) {
            try {
                data.put(replicationTopicConnectionFactoryBindingName,
                createConnectionFactory(environment));
                } catch (URISyntaxException e) {
                throw new NamingException(
                "Error initialisating TopicConnectionFactory with message "
                + e.getMessage());
            }
        }
        String getQueueConnectionfactoryBindingName = (String) environment
        .get(JMSUtil.GET_QUEUE_CONNECTION_FACTORY_BINDING_NAME);

        try {
            data.put(getQueueConnectionfactoryBindingName,
            createConnectionFactory(environment));
            } catch (URISyntaxException e) {
            throw new NamingException(
            "Error initialisating TopicConnectionFactory with message "
            + e.getMessage());
        }

        String replicationTopicBindingName = (String) environment
        .get(JMSUtil.REPLICATION_TOPIC_BINDING_NAME);
        String getQueueBindingName = (String) environment
        .get(JMSUtil.GET_QUEUE_BINDING_NAME);
        if (replicationTopicBindingName != null) {
            data.put(replicationTopicBindingName,
            createTopic(replicationTopicBindingName));
        }
        data.put(getQueueBindingName, createQueue(getQueueBindingName));
        return createContext(environment, data);
    }
}

1 个答案:

答案 0 :(得分:1)

我今天遇到了这个问题:原因是defaultCache不应该有:cacheLoaderFactory。 奇怪的是它没有在文档中提到( 所以我从defaultCache中删除了cacheLoaderFactory - 一切正常;