【问题标题】:How to correctly configure a global serializer?如何正确配置全局序列化程序?
【发布时间】:2020-10-20 12:21:46
【问题描述】:

我正在尝试为 Hazelcast 3.12 配置全局序列化程序(我的应用程序在与此版本的 Hazelcast 捆绑在一起的 payara 5 上运行,因此我无法更新到 4.x)

根据手册 (https://docs.hazelcast.org/docs/3.12/manual/html-single/index.html#global-serializer) 实现和配置全局序列化器应该很简单,这是我的序列化器:

public class MyGlobalStreamSerializer implements StreamSerializer<Object> {
    private static FSTConfiguration conf = FSTConfiguration.createDefaultConfiguration();

    @Override
    public int getTypeId() {
        return 123;
    }

    @Override
    public void destroy() {
    }

    @Override
    public void write(ObjectDataOutput objectDataOutput, Object o) throws IOException {
        objectDataOutput.write(conf.asByteArray(o));
    }

    @Override
    public Object read(ObjectDataInput objectDataInput) throws IOException {
        return conf.asObject(objectDataInput.readByteArray());
    }
}

我在实际的序列化实现中使用快速序列化:

<dependency>
    <groupId>de.ruedigermoeller</groupId>
    <artifactId>fst</artifactId>
    <version>2.57</version>
</dependency>

以及我的 hazelcast-config.xml 中的序列化配置

<serialization>
    <portable-version>0</portable-version>
    <serializers>            
        <global-serializer override-java-serialization="true" >de.mycompany.myapp.domain.MyGlobalStreamSerializer</global-serializer>
    </serializers>
</serialization>

但是在应用程序启动时,我在构建配置时收到 NullPointerException:

[2020-10-20T12:37:14.348+0200] [Payara 5.2020] [SEVERE] [NCLS-CORE-00014] [javax.enterprise.system.core] [tid: _ThreadID=1 _ThreadName=main] [timeMillis: 1603190234348] [levelValue: 1000] [[
  Shutdown required
MultiException stack 1 of 1
MultiException stack 1 of 4
java.lang.NullPointerException
        at fish.payara.nucleus.hazelcast.HazelcastCore.buildConfiguration(HazelcastCore.java:333)
        at fish.payara.nucleus.hazelcast.HazelcastCore.bootstrapHazelcast(HazelcastCore.java:480)
        at fish.payara.nucleus.hazelcast.HazelcastCore.getInstance(HazelcastCore.java:234)
        at fish.payara.nucleus.config.ClusteredConfig.postConstruct(ClusteredConfig.java:99)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.glassfish.hk2.utilities.reflection.ReflectionHelper.invoke(ReflectionHelper.java:1268)
        at org.jvnet.hk2.internal.ClazzCreator.postConstructMe(ClazzCreator.java:309)
        at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:351)
        at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:463)
        at org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:281)
        at org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:65)
        at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2102)
        at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:93)
        at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:679)
        at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:54)
        at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:188)
        at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:211)
        at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:334)
        at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:463)
        at org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:281)
        at org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:65)
        at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2102)
        at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:93)
        at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:67)
        at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1213)
        at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1144)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:821)
MultiException stack 2 of 4
java.lang.IllegalStateException: Unable to perform operation: post construct on fish.payara.nucleus.config.ClusteredConfig
        at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:369)
        at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:463)
        at org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:281)
        at org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:65)
        at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2102)
        at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:93)
        at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:679)
        at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:54)
        at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:188)
        at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:211)
        at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:334)
        at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:463)
        at org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:281)
        at org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:65)
        at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2102)
        at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:93)
        at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:67)
        at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1213)
        at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1144)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:821)
MultiException stack 3 of 4
java.lang.IllegalArgumentException: While attempting to resolve the dependencies of fish.payara.nucleus.requesttracing.RequestTracingService errors were found
        at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:224)
        at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:334)
        at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:463)
        at org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:281)
        at org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:65)
        at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2102)
        at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:93)
        at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:67)
        at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1213)
        at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1144)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:821)
MultiException stack 4 of 4
java.lang.IllegalStateException: Unable to perform operation: resolve on fish.payara.nucleus.requesttracing.RequestTracingService
        at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:363)
        at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:463)
        at org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:281)
        at org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:65)
        at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2102)
        at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:93)
        at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:67)
        at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1213)
        at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1144)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:821)
]]

在手册中看到的配置中仅使用类名作为 global-serializer 的值也不起作用,我最后一次尝试是使用完整路径,因为这就是在 hazelcast-full 中完成的方式-example.xml 随版本发布。

我还在这里看到了另一个帖子,其中有人试图使用 Kryo 作为实际序列化的实现来实现全局序列化程序,代码和配置看起来几乎相同,但他似乎没有遇到我的问题 (Hazelcast with global serializer (Kryo) - There is no suitable de-serializer for type ) 谁能告诉我我做错了什么?提前致谢!

【问题讨论】:

    标签: serialization configuration hazelcast payara


    【解决方案1】:

    Payara 服务器使用自己的无法禁用的序列化程序,请参阅文档:https://docs.payara.fish/community/docs/5.2020.5/documentation/payara-server/hazelcast/configuration.html。 Payara 序列化程序委托给 Hazelcast 配置中指定的 Hazelcast 全局序列化程序。这个序列化应该在 Payara Server 的类路径中,将它添加到您的应用程序中是不够的。

    尝试将带有 MyGlobalStreamSerializer 及其所有依赖项(例如 fst JAR 及其依赖项)的 JAR 文件添加到域目录中的 lib 目录中,这会将其添加到服务器的类路径中。这是asadmin add-library 命令的文档,您可以使用它:https://docs.payara.fish/community/docs/5.2020.5/documentation/payara-server/asadmin-commands/misc-commands.html#add-library-command

    在您的情况下,当 Payara 服务器想要记录您的全局序列化程序不是 Payara 序列化程序期望的 StreamSesrializer 的子类的消息时,似乎引发了异常:https://github.com/payara/Payara/blob/master/nucleus/payara-modules/hazelcast-bootstrap/src/main/java/fish/payara/nucleus/hazelcast/HazelcastCore.java#L333

    该代码在任何版本的 Payara Server 5.2020.x 中都没有更改,它可以抛出 NullPointerException 的唯一方法是全局序列化程序是 null。我预计会发生这种情况,因为 Hazelcast 找不到您的序列化程序的类并为序列化程序返回 null。

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 2021-11-22
      • 2022-10-31
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多