hazelcast / hazelcast-hibernate

A distributed second-level cache for Hibernate

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

OSGi java.lang.ClassNotFoundException: com.hazelcast.hibernate.instance.DefaultHazelcastInstanceFactory

fuemf opened this issue · comments

commented

Hi,
I am trying to use hazelcast-hibernate5-1.2.2 in an OSGi environment but I get the following exception on startup:

Caused by: org.apache.felix.log.LogException: org.hibernate.cache.CacheException: Failed to set up hazelcast instance factory
at com.hazelcast.hibernate.AbstractHazelcastCacheRegionFactory.start(AbstractHazelcastCacheRegionFactory.java:91)
at org.hibernate.internal.CacheImpl.(CacheImpl.java:49)
at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:28)
at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:20)
at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.initiateService(SessionFactoryServiceRegistryImpl.java:46)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:234)
... 16 more
Caused by: java.lang.ClassNotFoundException: com.hazelcast.hibernate.instance.DefaultHazelcastInstanceFactory
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1284)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1118)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.hazelcast.hibernate.AbstractHazelcastCacheRegionFactory.start(AbstractHazelcastCacheRegionFactory.java:88)

The problem is the code in method AbstractHazelcastCacheRegionFactory.start(...) which uses Thread.currentThread().getContextClassLoader() to try to load the class DefaultHazelcastInstanceFactory using Class.forName.

This is unnecessary as both classes are in the same bundle so just calling new DefaultHazelcastInstanceFactory() would be enough in the case that no property hibernate.cache.hazelcast.factory is defined.

Using the Thread's ContextClassLoader in an OSGi environment is generally not a good idea, it seems.

Hi @fuemf ,
I see you have a commit in your fork. davidfra@266d182
Did you solve your problem? As this is more OSGI related issue then @googlielmo can verify too.

Hi @mesutcelik,
yes I created a fork and fixed the classloader issue some time ago, but I did not find the time to test my changes until now. I just started our application with the fixed hazelcast-hibernate version and it started without errors. The HazelcastLocalCacheRegionFactory was correctly initialized.

I will do some more tests and actually putting some data in the cache, to see if everything works as it should.

When hibernate tries to read data from the cache I get this exception. I have to analyze this further.

2018-06-26 15:56:09,474 ERROR [hazelcast.event-3] .impl.eventservice.impl.EventServiceImpl - [127.0.0.1]:5701 [3.9] hz.test-hazelcast.event-3 caught an exception while processing task:com.hazelcast.spi.impl.eventservice.impl.LocalEventDispatcher@900b7b7
com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: org.hibernate.engine.jdbc.Size
	at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:224)
	at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48)
	at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:267)
	at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataInput.readObject(ByteArrayObjectDataInput.java:570)
	at com.hazelcast.hibernate.region.CacheKeyImpl.readData(CacheKeyImpl.java:89)
	at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.readInternal(DataSerializableSerializer.java:158)
	at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:105)
	at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:50)
	at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48)
	at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:267)
	at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataInput.readObject(ByteArrayObjectDataInput.java:570)
	at com.hazelcast.hibernate.local.Invalidation.readData(Invalidation.java:59)
	at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.readInternal(DataSerializableSerializer.java:158)
	at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:105)
	at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:50)
	at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48)
	at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:185)
	at com.hazelcast.topic.impl.DataAwareMessage.getMessageObject(DataAwareMessage.java:44)
	at com.hazelcast.hibernate.local.LocalRegionCache$1.onMessage(LocalRegionCache.java:208)
	at com.hazelcast.topic.impl.TopicService.dispatchEvent(TopicService.java:136)
	at com.hazelcast.spi.impl.eventservice.impl.LocalEventDispatcher.run(LocalEventDispatcher.java:64)
	at com.hazelcast.util.executor.StripedExecutor$Worker.process(StripedExecutor.java:225)
	at com.hazelcast.util.executor.StripedExecutor$Worker.run(StripedExecutor.java:208)
Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.jdbc.Size
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1284)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1118)
	at com.hazelcast.nio.ClassLoaderUtil.tryLoadClass(ClassLoaderUtil.java:173)
	at com.hazelcast.nio.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:147)
	at com.hazelcast.nio.IOUtil$ClassLoaderAwareObjectInputStream.resolveClass(IOUtil.java:552)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1859)