Ignite 具有出色的“零部署”功能,其工作流程如下:
- Ignite 将检查类是否在本地类路径中可用(即如果 它是在系统启动时加载的),如果是,它将是 回来。不会从对等节点加载类 案例。
- 如果类(class)在本地不可用,则请求将发送至 提供类定义的始发节点。始发节点 将发送类字节码定义并且类将被加载 工作节点。这种情况每节课只发生一次 - 一次课 定义被加载到一个节点上,它永远不会被加载 再次。
然后我写了一个示例代码:
Collection<Long> broadcastResult = compute.broadcast(new IgniteCallable<Long>() {
@Override
public Long call() throws Exception {
long result = 0;
Long total = getTotal(10);
for (int i = 0; i < total; i++) {
LOGGER.info("adding {}, result {}", i, (result = result + i));
}
return result;
}
});
...
public static Long getTotal(long total) {
LOGGER.info("Total:{}", total);
return total;
}
它工作正常,远程节点打印了十次 add xxx
日志。但我真的很想知道怎么做?
- Ignite 如何知道
我的 IgniteCallable 实例
需要getTotal(long total)
方法? - Ignite 如何将
我的 IgniteCallable 实例的字节码
传输到 当我只给他我的 IgniteCallable 实例时的远程节点 引用
而不是类文件?
请帮帮我,谢谢!
最佳答案
回答您的问题。
最初,您的
IgniteCallable
被序列化并通过网络发送。当 JVM 开始执行它并到达需要getTotal
的点时,它将查找具有此方法的类定义,如果 JVM 在本地找不到它,它将从中预加载它起源节点也是如此。一切都很简单。基本上,我们只是使用
igniteCalllable.getClass()
之类的调用将您的实例的Class
序列化并通过网络发送。如果您查看Class
对象源代码,您将看到它的Serializable
。
关于java - Ignite 零部署如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37153201/