Приєднати до віддаленого (не локального) VM

API Java Attach може приєднуватися до локальних віртуальних машин і завантажувати до нього агенти. Як я можу приєднати VM до іншого комп'ютера для завантаження агента?

Я знаю про JMX. Але я не з'ясував, як завантажити мій спеціальний агент на віддалений VM.

Може бути, існують інші способи вирішення моєї проблеми (завантаження та виконання спеціального коду (агента) для віддаленого VM)?

оновлення Я хочу виконати спеціальний код на віддаленому JVM. Незалежність початкових параметрів JVM - це плюс.

Дякую.

3
Яка оригінальна проблема, яку потрібно вирішити саме таким чином?
додано Автор Thorbjørn Ravn Andersen, джерело
Я буду сильно перешкоджати використанню агентів для оновлення програмного забезпечення. Уявіть собі проблеми з підтримкою, які ви можете отримати на цьому.
додано Автор Thorbjørn Ravn Andersen, джерело
додаток, моніторинг та оновлення коду на віддалених робочих чистих JVM
додано Автор Andrew Kondratovich, джерело

3 Відповіді

Без проблем робота сервера додатків (Tomcat) у виробництві, навіть за допомогою віддалена налагодження додається .

UPDATE

Якщо ви хочете виконати спеціальний код всередині вашого додатка, то одним рішенням було б написати клас і скласти його, зберегти його де-небудь на сервері, а потім у вашій програмі виконати такий метод:

/**
 * 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
    додано
    За допомогою віддаленої налагодження ви можете оцінювати вирази (цілі рядки коду). Ви не можете зберегти цей код, але ви можете змінити значення полів та змінних. Я не розумію, чого ти не хочеш, ви можете, будь ласка, змінити початкове запитання і докладно пояснити.
    додано Автор davorp, джерело
    Я оновив мою відповідь ...
    додано Автор davorp, джерело
    Мені потрібно ввести спеціальний код. З JMX я можу отримати інформацію про віддалений JVM, але я не можу вставляти та виконувати код. Приєднати API надавати способи завантаження виконуваного агента в JVM, але лише локальне JVM. Я шукаю спосіб зробити те ж саме з віддаленим JVM.
    додано Автор Andrew Kondratovich, джерело
    оновлений, як ви хочете.
    додано Автор Andrew Kondratovich, джерело

    Я не розумію питання, чи хочете ви просто підключитися до віддаленого VM? При підключенні ви можете виконати все, що завгодно, подія припинить роботу VM. Ви повинні почати свою віртуальну машину в режимі налагодження:

    -Xdebug -Xrunjdwp: transport = dt_socket, address = 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
    додано
    Я знаю про налагоджувальні інтерфейси, але мені це потрібно для виробництва, а не для налагодження.
    додано Автор Andrew Kondratovich, джерело

    Я знайшов експериментальне рішення: jsadebugd .
    Потім ви можете приєднати до нього з'єднання sun.jvm.hotspot.jdi.SAPIDAttachingConnector .

    0
    додано
    що ти маєш на увазі? Скільки кроків?
    додано Автор Nick Dong, джерело
    Ви вирішили це в програмі? @ Андрій Кнодратович
    додано Автор Nick Dong, джерело
    У мене така проблема з тобою. Як приєднати віддалений JVM та ввести код за допомогою програми без перезапуску дистанційного JVM для додавання деяких аргументів налагодження?
    додано Автор Nick Dong, джерело
    ІТ КПІ - Java
    ІТ КПІ - Java
    436 учасників