Adjuntar a VM remota (no local)

La API de Java Attach puede adjuntarse a máquinas virtuales locales y cargar agentes en ella. ¿Cómo puedo adjuntar a la máquina virtual en otra computadora para cargar el agente?

Sé de JMX. Pero no descubrí cómo cargar mi agente personalizado a una máquina virtual remota.

¿Quizás existan otras formas de resolver mi problema (para cargar y ejecutar código personalizado (agente) en una máquina virtual remota)?

actualizacion Quiero ejecutar código personalizado en JVM remoto. La independencia de los parámetros iniciales de JVM es más.

Gracias.

3
¿Cuál es el problema original que necesitas resolver de esta manera?
agregado el autor Thorbjørn Ravn Andersen, fuente
No voy a recomendar el uso de agentes para actualizar el software. Solo imagina los problemas de soporte que puedes obtener en esto.
agregado el autor Thorbjørn Ravn Andersen, fuente
adjuntos, monitoreo y actualización de código en JVMs limpias y de ejecución remota
agregado el autor Andrew Kondratovich, fuente

3 Respuestas

No es un problema ejecutar un servidor de aplicaciones (Tomcat) en producción, incluso con depuración remota adjunta .

ACTUALIZAR

Si desea ejecutar un código personalizado dentro de su aplicación, una solución sería escribir una clase y compilarlo, almacenarlo en algún lugar del servidor y luego, dentro de su aplicación, ejecutar algún método como este:

/**
 * 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
    agregado
    Con la depuración remota puede evaluar expresiones (líneas completas de código). No puede guardar ese código, pero puede cambiar los valores de los campos y las variables. No entiendo completamente lo que no quieres, ¿puedes editar tu pregunta inicial y explicar en detalles?
    agregado el autor davorp, fuente
    He actualizado mi respuesta ...
    agregado el autor davorp, fuente
    Necesito inyectar código personalizado. Con JMX puedo obtener información sobre JVM remota, pero no puedo inyectar y ejecutar código. La API adjunta proporciona formas de cargar el agente ejecutable en JVM, pero solo JVM local. Estoy buscando la manera de hacer lo mismo con la JVM remota.
    agregado el autor Andrew Kondratovich, fuente
    actualizado como desee.
    agregado el autor Andrew Kondratovich, fuente

    No entiendo la pregunta, ¿simplemente desea conectarse a una máquina virtual remota? Cuando está conectado, puede ejecutar lo que quiera, el evento termina la máquina virtual. Tienes que iniciar tu máquina virtual en modo de depuración:

    -Xdebug -Xrunjdwp: transporte = dt_socket, dirección = 8000, servidor = y, suspender = 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
    agregado
    Sé sobre las interfaces de depuración, pero necesito esto para la producción, no para la depuración.
    agregado el autor Andrew Kondratovich, fuente

    Encontré una solución experimental: jsadebugd .
    Luego puede conectarlo mediante el conector sun.jvm.hotspot.jdi.SAPIDAttachingConnector .

    0
    agregado
    ¿Qué quieres decir? Cuantos pasos
    agregado el autor Nick Dong, fuente
    ¿Resolviste esto en un programa? @Andrew Knodratovich
    agregado el autor Nick Dong, fuente
    Tengo el mismo problema contigo. ¿Cómo adjuntar un jvm remoto e inyectar código utilizando el programa sin reiniciar el jvm remoto para agregar algunos argumentos de depuración?
    agregado el autor Nick Dong, fuente