2016-05-11 12 views
3

Ignite Arbeit hat ein fantastisches Feature ‚Zero-Deployment‘ und seine Workflow wird wie folgt dar:Wie Ignite Zero-Deployment

  1. 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.
  2. 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?

  1. Wie weiß Ignite My IgniteCallable Instance Bedürfnisse getTotal(long total) Methode?
  2. Wie überträgt Ignite My IgniteCallable Instance's Byte Code zu Remote-Knoten, wenn ich ihm nur My IgniteCallable Instance's Reference anstelle einer Klassendatei geben?

Bitte helfen Sie mir, Danke!

Antwort

0

Beantworten Sie Ihre Fragen.

  1. Zunächst Ihre IgniteCallable wird über den Draht serialisiert und gesendet. Wenn die JVM mit der Ausführung beginnt und an den Punkt kommt, an dem getTotal benötigt wird, sucht sie nach einer Klassendefinition mit dieser Methode. Wenn sie von der JVM nicht lokal gefunden wird, lädt sie sie ebenfalls vom Ursprungsknoten aus.

  2. Alles ist einfach. Grundsätzlich nehmen wir einfach Class Ihrer Instanz mit einem Anruf wie igniteCalllable.getClass() serialisieren Sie es und senden Sie über die Leitung. Wenn Sie einen Blick auf Class Objektquellcode werfen, werden Sie sehen, dass sein Serializable.

+0

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. –

+0

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

+0

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

Verwandte Themen