我有一个任务'InfoTask'。当我试图在本地hazelcast中运行它时,它可以工作
public static void main(String[] args) throws Exception {
HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();
IExecutorService executor = hazelcastInstance.getExecutorService("exec");
for (int k = 1; k <= 1000; k++) {
Thread.sleep(1000);
System.out.println("Producing echo task: " + k);
Future<InfoHz> a = executor.submit(new InfoTask("a", "b", "c"));
a.get();
}
System.out.println("EchoTaskMain finished!");
}
但是当我试图在kubernetes中使用hazelcast执行此操作时,我得到了HazelcastSerializationException
我该如何解决这个问题?
com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: my.hazelcast.InfoTask
为什么在hazelcast文档中没有提到任务的序列化?
如果在类路径中没有添加jar,它是如何工作并且不抛出HazelcastSerializationException
的?包含my.hazelcast.InfoTask
的代码需要在Hazelcast pod的类路径上。
有很多方法可以实现这一点,这取决于你选择如何在Kubernetes上部署。
两种方法,但还有其他方法:
-
简单类路径:如果您使用helm之类的工具,那么
volumeMounts
允许您创建一个包含代码的目录。在这里,从Docker: extension - claspath -with-new-jars-or-files开始更容易理解这个概念。 -
自定义Jar:使用
jar-with-dependencies
构建自己的镜像,然后它只是一个单独的镜像,配置和代码可以在而不是外部烘烤。下面是一个例子。