私はSpring Cacheを備えたシステムを持っています。その中には複数のクラスローダーがあります。実際、私は ehcache を使用していますが、問題なく動作します。
@Component
public class ObjectRepository extends MongoRepository<Object> {
// -------------------------- OTHER METHODS --------------------------
@Override
@Cacheable(value = "object", key = "#p0+#p1.name")
public Object get(String id, Class<? extends Object> clazz) {
return super.get(id, clazz);
}
@Override
@CacheEvict(value = "object", key = "#p0+#p1.name")
public void remove(String id, Class<? extends Object> clazz) {
super.remove(id, clazz);
}
@Override
@CacheEvict(value = "object", key = "#p0+#p0.class.name")
public void save(Object object) {
super.save(object);
}
}
点火するように変更しようとしています:
@Bean
@SuppressWarnings("unchecked")
public CacheManager cacheManager() {
SpringCacheManager springCacheManager = new SpringCacheManager();
IgniteConfiguration igniteConfiguration = new IgniteConfiguration();
igniteConfiguration.setPeerClassLoadingEnabled(true);
igniteConfiguration.setIncludeEventTypes(org.apache.ignite.events.EventType.EVTS_TASK_EXECUTION);
springCacheManager.setConfiguration(igniteConfiguration);
return springCacheManager;
}
複数のクラスローダーがあるため、エラーが発生します。正常にobjectRepository.get("1", com.test.ClassInClassLoader1.class)
動作objectRepository.get("2", com.test.ClassInClassLoader2.class)
するとエラーが発生しますが、実行するとエラーが発生します。
Caused by: class org.apache.ignite.IgniteCheckedException: Encountered incompatible class loaders for cache [class1=com.test.ClassInClassLoader2, class2=com.test.ClassInClassLoader1]
at org.apache.ignite.internal.processors.cache.GridCacheDeploymentManager.registerClass(GridCacheDeploymentManager.java:656)
at org.apache.ignite.internal.processors.cache.GridCacheDeploymentManager.registerClass(GridCacheDeploymentManager.java:601)
at org.apache.ignite.internal.processors.cache.GridCacheDeploymentManager.registerClass(GridCacheDeploymentManager.java:590)
at org.apache.ignite.internal.processors.cache.GridCacheDeploymentManager.registerClasses(GridCacheDeploymentManager.java:573)
at org.apache.ignite.internal.processors.cache.GridCacheUtils.marshal(GridCacheUtils.java:950)
at org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessorImpl.marshal(IgniteCacheObjectProcessorImpl.java:94)
at org.apache.ignite.internal.processors.cache.portable.CacheObjectPortableProcessorImpl.marshal(CacheObjectPortableProcessorImpl.java:727)
at org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessorImpl$UserCacheObjectImpl.prepareForCache(IgniteCacheObjectProcessorImpl.java:343)
... 186 more
私は使用しようDeploymentMode.ISOLATED
としDeploymentMode.PRIVATE
ましたが、それらは動作しませんigniteConfiguration.setPeerClassLoadingEnabled(true)
。そのため、すべてのクラスを手動で登録する必要があり、LocalDeploymentSpi でそれを行う方法が見つかりませんでした。使用しようとしましigniteConfiguration.getDeploymentSpi()
たが、null であり、作成すると Ignite が無視するようになりますそこのクラス。