0

我正在与一个远程缓存服务器的多个客户端一起使用 jcs。

这里是服务器配置:

registry.host=xx.xx.xx.xx registry.port=1104

远程缓存服务端口=1104

remote.cache.rmiSocketFactoryTimeoutMillis=5000

remote.cluster.LocalClusterConsistency=true

remote.cluster.AllowClusterGet=true

jcs.default=DC

jcs.default.cacheattributes=org.apache.commons.jcs.engine.CompositeCacheAttributes jcs.default.cacheattributes.MaxObjects=100 jcs.default.cacheattributes.MaxMemoryIdleTimeSeconds=1800 jcs.default.cacheattributes.UseMemoryShrinker=true

jcs.default.elementattributes.IsEternal=false jcs.default.elementattributes=org.apache.commons.jcs.engine.ElementAttributes

jcs.auxiliary.DC=org.apache.commons.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory jcs.auxiliary.DC.attributes=org.apache.commons.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes

jcs.auxiliary.DC.attributes.DiskPath=/home/java/conf/data jcs.auxiliary.DC.attributes.MaxPurgatorySize=1000

jcs.auxiliary.DC.attributes.MaxKeySize=1000 jcs.auxiliary.DC.attributes.OptimizeAtRemoveCount=300 jcs.auxiliary.DC.attributes.OptimizeOnShutdown=true jcs.auxiliary.DC.attributes.ClearDiskOnStartup=true jcs.auxiliary.DC。属性.DiskLimitType=SIZE

和客户端配置:

jcs.auxiliary.RC=org.apache.commons.jcs.auxiliary.remote.RemoteCacheFactory jcs.auxiliary.RC.attributes=org.apache.commons.jcs.auxiliary.remote.RemoteCacheAttributes jcs.auxiliary.RC.attributes.FailoverServers= xx.xx.xx.xx:1104 jcs.auxiliary.RC.attributes.RemoveUponRemotePut=false

jcs.auxiliary.RC.attributes.Receive=false jcs.auxiliary.RC.elementattributes.UseMemoryShrinker=true

客户端代码放在这里:

    public class JcsSharedCache<K, V> implements ICache<K, V> {
        private CompositeCache<K, V> internal;
        public void put(K key, V value) throws BeCacheException {
            try {
                synchronized(this){
                      internal.update(new CacheElement<>(internal.getCacheName(), key, value, internal.getElementAttributes()));
                 }
            } catch (Exception ex) {
                throw new BeCacheException(ex);
            }

        }
    }

有时客户端会收到 ConcurrentModificationException 并且 jcs 禁用远程放置。每个客户端都有一个同步版本的 put,但是(在我看来)当两个客户端尝试同时将某些内容放在同一个缓存中时,就会发生这种情况。

有没有办法避免这种行为?

在堆栈跟踪下方:

2018-07-10 18:02:52 错误 RemoteCache:141 - 由于错误而禁用远程缓存:无法将 [da4a81e6-85df-426a-b6f6-a5b6777b0891] 放入节点 java.util.ConcurrentModificationException 在 java.util.HashMap$ HashIterator.nextNode(HashMap.java:1442) 在 java.util.HashMap$KeyIterator.next(HashMap.java:1466) 在 java.util.HashSet.writeObject(HashSet.java:287) 在 sun.reflect.GeneratedMethodAccessor135.invoke (未知来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1128 ) 在 java.io.ObjectOutputStream 的 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)。writeOrdinaryObject(ObjectOutputStream.java:1432) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) at java.util.HashMap.internalWriteEntries(HashMap.java :1790) 在 sun.reflect.GeneratedMethodAccessor132.invoke(Unknown Source) 在 java.lang 的 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 的 java.util.HashMap.writeObject(HashMap.java:1363)。 reflect.Method.invoke(Method.java:498) 在 java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1128) 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496) 在 java.io.ObjectOutputStream.writeOrdinaryObject (对象输出流.java:1432) 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) 在 java. io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 在 java.util.ArrayList.writeObject (ArrayList.java:766) 在 sun.reflect.GeneratedMethodAccessor128.invoke(Unknown Source) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498 ) 在 java.io.ObjectStreamClass。invokeWriteObject(ObjectStreamClass.java:1128) 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496) 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java :1178) 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 在 org.apache.commons.jcs.utils.serialization.StandardSerializer.serialize(StandardSerializer.java:55) 在 org.apache.commons.jcs。 org.apache.commons.jcs.auxiliary.remote.AbstractRemoteAuxiliaryCache.processUpdate(AbstractRemoteAuxiliaryCache.java:421) 在 org.apache.commons.jcs.auxiliary 的 utils.serialization.SerializationConversionUtil.getSerializedCacheElement(SerializationConversionUtil.java:74)。AbstractAuxiliaryCacheEventLogging.updateWithEventLogging(AbstractAuxiliaryCacheEventLogging.java:65) at org.apache.commons.jcs.auxiliary.AbstractAuxiliaryCacheEventLogging.update(AbstractAuxiliaryCacheEventLogging.java:50) at org.apache.commons.jcs.engine.CacheAdaptor.handlePut(CacheAdaptor.java: 96) 在 org.apache.commons.jcs.engine.AbstractCacheEventQueue$AbstractCacheEvent.run(AbstractCacheEventQueue.java:281) 在 org.apache.commons.jcs.engine.AbstractCacheEventQueue$PutEvent.doRun(AbstractCacheEventQueue.java:362) 在 org .apache.commons.jcs.engine.CacheEventQueue$QProcessor.run(CacheEventQueue.java:228)50) 在 org.apache.commons.jcs.engine.AbstractCacheEventQueue$PutEvent.doRun(AbstractCacheEventQueue.java:362) 在 org.apache.org.apache.commons.jcs.engine.CacheAdaptor.handlePut(CacheAdaptor.java:96) .commons.jcs.engine.AbstractCacheEventQueue$AbstractCacheEvent.run(AbstractCacheEventQueue.java:281) 在 org.apache.commons.jcs.engine.CacheEventQueue$QProcessor.run(CacheEventQueue.java:228)50) 在 org.apache.commons.jcs.engine.AbstractCacheEventQueue$PutEvent.doRun(AbstractCacheEventQueue.java:362) 在 org.apache.org.apache.commons.jcs.engine.CacheAdaptor.handlePut(CacheAdaptor.java:96) .commons.jcs.engine.AbstractCacheEventQueue$AbstractCacheEvent.run(AbstractCacheEventQueue.java:281) 在 org.apache.commons.jcs.engine.CacheEventQueue$QProcessor.run(CacheEventQueue.java:228)228)228)

4

0 回答 0