java - Ignite 零部署如何工作

标签 java ignite

Ignite 具有出色的“零部署”功能,其工作流程如下:

  1. Ignite 将检查类是否在本地类路径中可用(即如果 它是在系统启动时加载的),如果是,它将是 回来。不会从对等节点加载类 案例。
  2. 如果类(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 日志。但我真的很想知道怎么做?

  1. Ignite 如何知道我的 IgniteCallable 实例需要 getTotal(long total) 方法?
  2. Ignite 如何将我的 IgniteCallable 实例的字节码 传输到 当我只给他 我的 IgniteCallable 实例时的远程节点 引用而不是类文件?

请帮帮我,谢谢!

最佳答案

回答您的问题。

  1. 最初,您的 IgniteCallable 被序列化并通过网络发送。当 JVM 开始执行它并到达需要 getTotal 的点时,它将查找具有此方法的类定义,如果 JVM 在本地找不到它,它将从中预加载它起源节点也是如此。

  2. 一切都很简单。基本上,我们只是使用 igniteCalllable.getClass() 之类的调用将您的实例的 Class 序列化并通过网络发送。如果您查看 Class 对象源代码,您将看到它的 Serializable

关于java - Ignite 零部署如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37153201/

相关文章:

ignite - Apache IgniteCache Entry 处理器在主节点和副本节点上执行

java - 检查一个数组中的所有值是否都存在于另一个数组中

java - Netbeans 编辑器库?

java - 如何获取上个月的第一个日期和最后一个日期? ( java )

java - Android + Apache POI 我需要读取 .docx 并转换为文本

java - Android-如何让移动的屏幕对象扩展Button

java - 为什么 "IGNITE"计算的字段返回 "BIGINT"类型?理论上应该是 "DECIMAL"类型,因为结果包含十进制数字

c++ - Apache Ignite C++ 瘦客户端 : How do I put/get a byte array?

ignite - Apache Ignite 定义可插入哈希算法

sql - Hazelcast 是否支持像 Apache Ignite 这样的 SQL 查询?