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

10-05 18:50