リモート(ローカルではない)VMにアタッチする

Java Attach APIは、ローカルVMに接続し、エージェントをエージェントにロードできます。エージェントを読み込むために別のコンピュータのVMにどのように接続できますか?

私はJMXについて知っています。しかし、私はどのように私のカスタムエージェントをリモートVMにロードするのか分からなかった。

たぶん私の問題を解決する別の方法が存在する(リモートVMにカスタムコード(エージェント)をロードして実行する)?

UP。リモートJVMでカスタムコードを実行したい初期JVMパラメータの独立性はプラスです。

ありがとう。

3
このようにして解決しなければならない最初の問題は何ですか?
追加された 著者 Thorbjørn Ravn Andersen,
ソフトウェアをアップデートするためのエージェントの使用を強くお勧めします。あなたがこれで得ることができるサポートの問題を想像してみてください。
追加された 著者 Thorbjørn Ravn Andersen,
遠隔実行クリーンJVMでのアタッチ、モニタリング、コード更新
追加された 著者 Andrew Kondratovich,

3 答え

It's no problem running a application server (Tomcat) in production, even with remote debugging attached.

更新

あなたのアプリケーション内でカスタムコードを実行したい場合は、クラスを作成してコンパイルし、サーバのどこかに格納してから、アプリ内で次のようなメソッドを実行することができます:

/**
 * 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に関する情報を得ることができますが、コードを注入して実行することはできません。 Attach APIは、JVM内の実行可能エージェントをロードする方法を提供しますが、ローカルJVMのみを提供します。リモートJVMで同じことをする方法を探しています。
    追加された 著者 Andrew Kondratovich,
    あなたが望むように更新されました。
    追加された 著者 Andrew Kondratovich,

    私は質問を理解していない、あなたはリモートVMに接続したいですか?接続すると、必要なものを実行できます。イベントは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,
    プログラムでこれを解決しましたか? @Andrew Knodratovich
    追加された 著者 Nick Dong,
    私はあなたと同じ問題があります。どのようにリモートjvmを接続し、プログラムを使用してコードを注入すると、いくつかのデバッグ引数を追加するリモートjvmを再起動せずに?
    追加された 著者 Nick Dong,