Ignite Arbeit hat ein fantastisches Feature ‚Zero-Deployment‘ und seine Workflow wird wie folgt dar:Wie Ignite Zero-Deployment
- Ignite wird überprüfen, ob Klasse auf lokalen Classpath verfügbar ist (dh, wenn es bei System geladen wurde Start), und wenn es war, wird es zurückgegeben werden. In diesem Fall findet kein Klassenladen von einem Peer-Knoten statt.
- Wenn die Klasse nicht lokal verfügbar ist, wird eine Anforderung an des Ursprungsknotens gesendet, um die Klassendefinition bereitzustellen. Der Ursprungsknoten sendet die Klassenbyte-Code-Definition und die Klasse wird unter dem Worker-Knoten geladen. Dies geschieht nur einmal pro Klasse - sobald die Klasse Definition auf einen Knoten geladen wird, muss sie nie wieder geladen werden.
Und ich schreibe einen Beispielcode:
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;
}
Und es funktioniert gut, Remote Node add xxx
log zehnmal gedruckt. Aber ich frage mich wirklich wie?
- Wie weiß Ignite
My IgniteCallable Instance
BedürfnissegetTotal(long total)
Methode? - Wie überträgt Ignite
My IgniteCallable Instance's Byte Code
zu Remote-Knoten, wenn ich ihm nurMy IgniteCallable Instance's Reference
anstelle einer Klassendatei geben?
Bitte helfen Sie mir, Danke!
Kleine Korrektur. Die Methode 'getTotal' ist statisch, daher ist die Instanz der einschließenden Klasse nicht serialisiert (und existiert wahrscheinlich auch nicht). Der Bytecode für diese Klasse wird jedoch vom Klassenladeprogramm des Serverknotens geladen, wenn er benötigt wird. –
Danke für die Antwort. Ich habe einige Punkte herausgefunden, aber nicht ganz klar. Wenn ein Knoten die 'IgniteCallable'-Instanz an den entfernten Knoten sendet, der ausgeführt werden soll, wird er im allgemeinen serialisiert. Der Schlüsselpunkt ist Remote-Knoten hat einen speziellen Classloader. während des Deserialisierungsprozesses. Die 'resolve()' Methode des Classloaders wird aufgerufen, und alle abhängigen Klassen werden an den Classloader übergeben und der Classloader versucht, die Klasse von lokal zu laden, falls lokal, oder eine 'Class Fetch' Anfrage zu senden und von einem anderen Knoten zu bekommen. Aber ich bin mir nicht ganz sicher oder klar darüber. – BilboDai
Ihr Verständnis ist fast vollständig richtig.Der einzige Zusatz, den ich habe, ist, dass eine abhängige Klasse, deren Methoden oder Instanzen irgendwie in der Quelle Ihrer 'IgniteCallable' verwendet werden, nur geladen wird, wenn eine JVM zum Ausführungspunkt kommt, wenn die abhängige Klasse benötigt wird. – dmagda