Воспламенения имеет функцию фантастического «нулевое РазВЕРТЫВаНИе» и его рабочий процесс выглядит следующим образом:Как Ignite Нулевой развертывания работы
- Ignite будет проверять, если класс доступен на локальном пути к классам (например, если он был загружен в системе startup), и если бы это было так, это будет . В этом случае не будет загружена загрузка класса из однорангового узла.
- Если класс не доступен на местном уровне, запрос отправляет исходному узлу для определения класса. Исходный узел отправит определение байтового байта класса, и класс будет загружен на рабочий узел. Это происходит только один раз для каждого класса - определение класса загружается на узле, после чего он не должен быть снова загружен .
И я пишу код примера:
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 знать
My IgniteCallable Instance
потребностиgetTotal(long total)
метод? - Как передает Ignite передача
My IgniteCallable Instance's Byte Code
в Удаленный узел, когда я даю емуMy IgniteCallable Instance's Reference
, а не файл класса?
Пожалуйста, помогите мне, спасибо!
Небольшая коррекция. Метод getTotal статичен, поэтому экземпляр охватывающего класса не сериализуется (и, вероятно, даже не существует). Но байт-код для этого класса будет загружаться загрузчиком классов узла сервера, когда ему это нужно. –
Спасибо за ответ. Я понял некоторые моменты, но не совсем ясно. Когда узел отправляет экземпляр 'IgniteCallable' на удаленный узел, который должен быть выполнен, он сериализуется в общем виде. ключевой момент - удаленный узел имеет специальный загрузчик классов. во время процесса десериализации. Вызывается метод 'resol()' класса Loadload(), и весь зависимый класс будет передан классу-загрузчику, а загрузчик классов попытается загрузить класс из локального, если он есть, или передаст запрос 'Class Fetch' и получит от другого узла. Но я не уверен в этом. – BilboDai
Ваше понимание почти полностью правильно.Единственное дополнение, которое у меня есть, это то, что зависимый класс, какие методы или экземпляры каким-то образом используются в источнике вашего IgnitCallable, будет загружаться только тогда, когда JVM подходит к точке выполнения, когда необходим зависимый класс. – dmagda