【问题标题】:Cellar Hazelcast serialization exception when using DOSGi service使用 DOSGi 服务时的 Cellar Hazelcast 序列化异常
【发布时间】: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-api
    • frontend
  • machine002.company.int
    • myservice-api
    • myservice-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


【解决方案1】:

看起来您的 api 包实际上并未导出所需的包。 因此,请确保它确实如此。而且由于它在“服务器”端工作, 我确定您的实现包可能包含这些 API 包。因此,请确保您的捆绑包的导出/导入等是正确的。

【讨论】:

    猜你喜欢
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多