An Remote-VM (nicht lokal) anhängen

Die Java Attach-API kann an lokale VMs angehängt werden und Agenten dorthin laden. Wie kann ich an VM auf einem anderen Computer anhängen, um Agenten zu laden?

Ich kenne JMX. Aber ich habe nicht herausgefunden, wie mein angepasster Agent auf Remote-VM geladen wird.

Vielleicht gibt es eine andere Möglichkeit, mein Problem zu lösen (benutzerdefinierten Code (Agent) auf Remote-VM zu laden und auszuführen)?

upd. Ich möchte benutzerdefinierten Code auf Remote-JVM ausführen. Die Unabhängigkeit der anfänglichen JVM-Parameter ist positiv.

Vielen Dank.

3
Was ist das ursprüngliche Problem, das Sie auf diese Weise lösen müssen?
hinzugefügt der Autor Thorbjørn Ravn Andersen, Quelle
Ich rate dringend davon ab, Agenten zum Aktualisieren von Software zu verwenden. Stellen Sie sich nur die Support-Probleme vor, die Sie dabei bekommen können.
hinzugefügt der Autor Thorbjørn Ravn Andersen, Quelle
Anhang, Überwachung und Code-Update bei Remote-Ausführung von sauberen JVMs
hinzugefügt der Autor Andrew Kondratovich, Quelle

3 Antworten

Es ist kein Problem, einen Anwendungsserver (Tomcat) in der Produktion zu betreiben, selbst mit Remote-Debugging beigefügt .

AKTUALISIEREN

Wenn Sie in Ihrer App benutzerdefinierten Code ausführen möchten, besteht eine Lösung darin, eine Klasse zu schreiben und zu kompilieren, sie irgendwo auf dem Server zu speichern und dann in Ihrer App eine der folgenden Methoden auszuführen:

/**
 * This method:
 * 
  • loads a class from the server file system *
    • does a lookup for the method to execute *
    • creates a new instance of the specified class *
    • executes the given method with the given arguments * (which can be null if the method doesn't have arguments) *
    • returns the result of the invoked method * * @param classUrlOnTheServer * @param className * @param methodNameToExecute * @param argumentsForTheMethod arguments that should be passed to * the method of the loaded class - can * be null. * @return returns the result of the invoked method * @throws ClassNotFoundException * @throws MalformedURLException * @throws SecurityException * @throws NoSuchMethodException * @throws InstantiationException * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException */ public static Object loadAndExecuteCustomMethodFromALoadedClass(String classUrlOnTheServer, String className, String methodNameToExecute, Object ... argumentsForTheMethod) throws ClassNotFoundException, MalformedURLException, SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { File file = new File(classUrlOnTheServer); URL url = file.toURI().toURL(); URL[] urls = new URL[] { url }; ClassLoader cl = new URLClassLoader(urls); Class clazz = cl.loadClass(className); Method method = clazz.getDeclaredMethod(methodNameToExecute); Object instance = clazz.newInstance(); Object result = method.invoke(instance, argumentsForTheMethod); return result; }
  • 2
    hinzugefügt
    Mit Remote-Debugging können Sie Ausdrücke (ganze Codezeilen) auswerten. Sie können diesen Code nicht speichern, aber Sie können Werte von Feldern und Variablen ändern. Ich verstehe nicht ganz, was Sie wollen, können Sie bitte Ihre erste Frage bearbeiten und ausführlich erklären.
    hinzugefügt der Autor davorp, Quelle
    Ich habe meine Antwort aktualisiert ...
    hinzugefügt der Autor davorp, Quelle
    Ich muss benutzerdefinierten Code injizieren. Mit JMX kann ich Informationen über Remote JVM erhalten, aber ich kann Code nicht injizieren und ausführen. Die Attach-API bietet Möglichkeiten zum Laden eines ausführbaren Agenten in JVM, aber nur in einer lokalen JVM. Ich bin auf der Suche nach dem gleichen Weg mit Remote-JVM.
    hinzugefügt der Autor Andrew Kondratovich, Quelle
    aktualisiert, wie Sie es wünschen.
    hinzugefügt der Autor Andrew Kondratovich, Quelle

    Ich verstehe die Frage nicht. Möchten Sie sich nur mit einer Remote-VM verbinden? Wenn Sie verbunden sind, können Sie ausführen, was Sie wollen, Ereignis beendet die VM. Sie müssen Ihre VM im Debug-Modus starten:

    -Xdebug -Xrunjdwp: Transport = dt_socket, Adresse = 8000, Server = y, Suspend = n

    Then in Eclipse for example, create a new remote application profile. check this : http://www.ibm.com/developerworks/opensource/library/os-eclipse-javadebug/index.html

    0
    hinzugefügt
    Ich kenne Debug-Schnittstellen, aber ich brauche das für die Produktion, nicht für das Debuggen.
    hinzugefügt der Autor Andrew Kondratovich, Quelle

    Ich habe eine experimentelle Lösung gefunden: jsadebugd .
    Dann können Sie es über den sun.jvm.hotspot.jdi.SAPIDAttachingConnector -Anschluss anfügen.

    0
    hinzugefügt
    Was meinen Sie? Wie viele Schritte?
    hinzugefügt der Autor Nick Dong, Quelle
    Hast du das in einem Programm gelöst? @ Andrew Knodratowitsch
    hinzugefügt der Autor Nick Dong, Quelle
    Ich habe dasselbe Problem mit dir. Wie kann man einen Remote-JVM anhängen und Code mit dem Programm injizieren, ohne den Remote-JVM neu zu starten, um einige Debug-Argumente hinzuzufügen?
    hinzugefügt der Autor Nick Dong, Quelle