Ignite具有出色的“零部署”功能,其工作流程如下:
Ignite将检查本地类路径上是否有可用的类(即是否
它是在系统启动时加载的),如果是,它将是
回来。在此不会从对等节点加载任何类
案件。
如果该课程在本地不可用,则将请求发送至
提供类定义的原始节点。始发节点
将发送类字节码定义,并将该类加载到
工作节点。每个班级仅发生一次-一次班级
定义已加载到节点上,因此永远不必加载
再次。
我编写了一个示例代码:
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;
}
而且工作正常,Remote Node打印
add xxx
日志十次。但是我真的想知道如何?如何点燃
My IgniteCallable Instance
需求getTotal(long total)
方法?点燃如何将
My IgniteCallable Instance's Byte Code
转移到远程节点,当我只给他
My IgniteCallable Instance'sReference
而不是班级文件时?请帮帮我,谢谢!
最佳答案
回答您的问题。
最初,您的IgniteCallable
被序列化并通过电线发送。当JVM开始执行它并到达需要getTotal
的地步时,它将寻找具有此方法的类定义,并且如果JVM在本地找不到它,它也会从始发节点预加载它。 。
一切都很简单。基本上,我们只使用Class
进行调用来获取您实例的igniteCalllable.getClass()
序列化并通过网络发送。如果看一下Class
对象源代码,就会看到它的Serializable
。