【发布时间】:2017-08-04 18:34:42
【问题描述】:
我用以下三个捆绑包做了一个应用程序
-
myservice-api- 包含模型类来传输数据
de.myservice.api.model.MyObject - 包含服务接口
de.myservice.api.services.MyService和功能void save(MyObject o)
- 包含模型类来传输数据
-
myservice-impl- 包含
MyService的实现并通过 DOSGi 提供
- 包含
-
frontend只是一些通过蓝图引用MyService实现并调用save函数的代码
我使用 Apache Cellar 功能创建了一个集群,其中两个 Karaf 服务器位于不同的机器上。捆绑包是这样部署的,并显示状态Active:
- machine001.company.int
myservice-apifrontend
- machine002.company.int
myservice-apimyservice-impl
使用cluster:list-nodes时显示集群已建立,使用cluster:service-list可以看到我的服务是由machine002提供的:
Service Class | Provider Node
-----------------------------------------------------------------
de.myservice.api.services.MyService | machine002.company.int:5701
OSGi 链接和东西可以工作,但是当frontend 尝试使用save 函数时,我在服务提供实例machine002 上收到以下异常:
2017-03-14 12:55:02,250 | WARN | pool-65-thread-1 | QueueConsumer | 328 - org.apache.karaf.cellar.hazelcast - 4.0.3 |
CELLAR HAZELCAST: consumer task failed to poll the queue com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: de.myservice.api.model.MyObject
at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:224)[322:com.hazelcast:3.7.2]
at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:46)[322:com.hazelcast:3.7.2]
at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:172)[322:com.hazelcast:3.7.2]
at com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.resolve(InvocationFuture.java:103)[322:com.hazelcast:3.7.2]
at com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.resolveAndThrow(InvocationFuture.java:74)[322:com.hazelcast:3.7.2]
at com.hazelcast.spi.impl.AbstractInvocationFuture.get(AbstractInvocationFuture.java:158)[322:com.hazelcast:3.7.2]
at com.hazelcast.collection.impl.queue.QueueProxySupport.invokeAndGet(QueueProxySupport.java:177)[322:com.hazelcast:3.7.2]
at com.hazelcast.collection.impl.queue.QueueProxySupport.pollInternal(QueueProxySupport.java:124)[322:com.hazelcast:3.7.2]
at com.hazelcast.collection.impl.queue.QueueProxyImpl.poll(QueueProxyImpl.java:88)[322:com.hazelcast:3.7.2]
at org.apache.karaf.cellar.hazelcast.QueueConsumer.run(QueueConsumer.java:93)[328:org.apache.karaf.cellar.hazelcast:4.0.3]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_45]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_45]
at java.lang.Thread.run(Thread.java:745)[:1.8.0_45]
Caused by: java.lang.ClassNotFoundException: de.myservice.api.model.MyObject
at org.apache.karaf.cellar.core.utils.CombinedClassLoader.findClass(CombinedClassLoader.java:79)[326:org.apache.karaf.cellar.core:4.0.3]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)[:1.8.0_45]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)[:1.8.0_45]
at com.hazelcast.nio.ClassLoaderUtil.tryLoadClass(ClassLoaderUtil.java:151)
at com.hazelcast.nio.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:120)
at com.hazelcast.nio.IOUtil$ClassLoaderAwareObjectInputStream.resolveClass(IOUtil.java:358)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)[:1.8.0_45]
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)[:1.8.0_45]
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)[:1.8.0_45]
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)[:1.8.0_45]
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)[:1.8.0_45]
at java.util.LinkedList.readObject(LinkedList.java:1149)[:1.8.0_45]
at sun.reflect.GeneratedMethodAccessor27.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_45]
at java.lang.reflect.Method.invoke(Method.java:497)[:1.8.0_45]
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)[:1.8.0_45]
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)[:1.8.0_45]
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)[:1.8.0_45]
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)[:1.8.0_45]
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)[:1.8.0_45]
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)[:1.8.0_45]
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)[:1.8.0_45]
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)[:1.8.0_45]
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)[:1.8.0_45]
at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:219)[322:com.hazelcast:3.7.2]
... 12 more
myservice-api 捆绑包部署在两台机器上,因此该类应该可用 - 我必须配置其他东西以便 hazelcast 知道从哪里获取类以进行反序列化吗?
【问题讨论】:
-
我认为问题很明显'Caused by: java.lang.ClassNotFoundException: de.haba.genex.exp.automation.api.model.AutomatedExport'这意味着Hazelcast无法加载该类。你是如何创建 HazelcastInstance 的?它似乎无法访问 BundleClassloader。
-
@noctarius 地窖功能完成了设置 Hazelcast 集群的所有工作。我知道这显然是问题所在,但我找不到任何有关如何配置 Cellar 以使其工作的信息。
标签: java osgi hazelcast apache-karaf dosgi