2016-05-11 3 views
3

Воспламенения имеет функцию фантастического «нулевое РазВЕРТЫВаНИе» и его рабочий процесс выглядит следующим образом:Как Ignite Нулевой развертывания работы

  1. Ignite будет проверять, если класс доступен на локальном пути к классам (например, если он был загружен в системе startup), и если бы это было так, это будет . В этом случае не будет загружена загрузка класса из однорангового узла.
  2. Если класс не доступен на местном уровне, запрос отправляет исходному узлу для определения класса. Исходный узел отправит определение байтового байта класса, и класс будет загружен на рабочий узел. Это происходит только один раз для каждого класса - определение класса загружается на узле, после чего он не должен быть снова загружен .

И я пишу код примера:

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 знать My IgniteCallable Instance потребности getTotal(long total) метод?
  2. Как передает Ignite передача My IgniteCallable Instance's Byte Code в Удаленный узел, когда я даю ему My IgniteCallable Instance's Reference, а не файл класса?

Пожалуйста, помогите мне, спасибо!

ответ

0

Ответы на ваши вопросы.

  1. Первоначально ваш IgniteCallable получает сериализовать и передается по проводам. Когда JVM начинает выполнять его и приходит к точке, когда требуется getTotal, он будет искать определение класса, которое имеет этот метод, и если JVM не находит его локально, он также предварительно загрузит его из узла-источника.

  2. Все просто. В основном мы просто принимаем Class вашего экземпляра, используя вызов типа igniteCalllable.getClass(). Сериализуем его и отправляем по кабелю. Если вы посмотрите на исходный код объекта Class, вы увидите, что его Serializable.

+0

Небольшая коррекция. Метод getTotal статичен, поэтому экземпляр охватывающего класса не сериализуется (и, вероятно, даже не существует). Но байт-код для этого класса будет загружаться загрузчиком классов узла сервера, когда ему это нужно. –

+0

Спасибо за ответ. Я понял некоторые моменты, но не совсем ясно. Когда узел отправляет экземпляр 'IgniteCallable' на удаленный узел, который должен быть выполнен, он сериализуется в общем виде. ключевой момент - удаленный узел имеет специальный загрузчик классов. во время процесса десериализации. Вызывается метод 'resol()' класса Loadload(), и весь зависимый класс будет передан классу-загрузчику, а загрузчик классов попытается загрузить класс из локального, если он есть, или передаст запрос 'Class Fetch' и получит от другого узла. Но я не уверен в этом. – BilboDai

+0

Ваше понимание почти полностью правильно.Единственное дополнение, которое у меня есть, это то, что зависимый класс, какие методы или экземпляры каким-то образом используются в источнике вашего IgnitCallable, будет загружаться только тогда, когда JVM подходит к точке выполнения, когда необходим зависимый класс. – dmagda