を探しています:
- JMXとは何ですか。
- いくつかの優れたJMXチュートリアルを見つけることができます。
- JMXがJavaEEプログラマーとして私に提供できるもの。
- 私が知っておくべき他のこと。
を探しています:
JMXは、アプリケーションの実行時状態を表示および操作する方法です。それが役立つのであれば、SNMPと概念的には多少似ています。IMOは、ログファイルへの書き込み以外に他のユーザーインターフェイスを持たない可能性のあるサーバータイプのアプリケーションを監視および理解するために不可欠です。
基本的なアプローチは、監視したいもののインターフェースを作成し、クラスにインターフェースを実装させ、そのクラスのインスタンスを「MBeanServer」に登録することです(これにより、インターフェースで定義されたものをJMXモニターで使用できるようになります) jconsoleのようなアプリ)。
これは些細なことですが、機能しています。例:
(Java 5以降を想定しています)
public interface TestServerMBean
{
public long getUptimeMillis();
public long getFooCount();
public void setFooCount(long val);
public void printStuff(String stuff);
}
import java.lang.management.ManagementFactory;
import java.util.concurrent.atomic.AtomicLong;
import javax.management.ObjectName;
// If jconsole doesn't see this app automatically, invoke the application with the following java flags, and connect
// 'remotely' via jconsole.
//
// -Dcom.sun.management.jmxremote
// -Dcom.sun.management.jmxremote.port=2222 (or whatever)
// -Dcom.sun.management.jmxremote.authenticate=false
// -Dcom.sun.management.jmxremote.ssl=false
public class TestServer implements TestServerMBean
{
private final AtomicLong m_counter = new AtomicLong(0L);
private final long m_startTimeMillis = System.currentTimeMillis();
public void run() throws InterruptedException {
while (true) {
m_counter.incrementAndGet();
Thread.sleep(5000);
}
}
public long getFooCount() {
return m_counter.get();
}
public void setFooCount(long val) {
m_counter.set(val);
}
public long getUptimeMillis() {
return System.currentTimeMillis() - m_startTimeMillis;
}
public void printStuff(String stuff) {
System.out.println(stuff);
}
public static void main(String[] args) throws Exception {
TestServer ts = new TestServer();
ManagementFactory.getPlatformMBeanServer().registerMBean(ts, new ObjectName("myapp:service=MyServer"));
ts.run();
}
}
TestServer.classを通常どおりにコンパイルして実行し、起動jconsole
してTestServerに接続し(自動的に表示されます。それ以外の場合は上記のコードのコメントを参照してください)、[MBeans]タブを確認すると、という名前のインスタンスが表示されmyapp:service=MyServer
ます。現在の「稼働時間」を表示し、FooCounter
5秒ごとに増分を監視できます。FooCounterを任意の(長い)値に設定printStuff
し、任意のString引数を使用してメソッドを呼び出すこともできます。
明らかにこれはばかげた「サーバー」ですが、簡単な実例があると、実行中のアプリを覗き込んで操作できるという全体的な概念を説明するのに役立つことを願っています。
多くの追加機能とさまざまなタイプのMBeanがありますが、上記のバニラJMXだけが大いに役立ちます。IMO。
簡単に言えば、JMX を使用すると、リモートでメソッドを呼び出したり、実行中の JVM の内部から公開されたデータを表示したりできます。多くのアプリケーションは、リモート管理を提供するために、JMX を使用して、実行中の JVM にリモート ダッシュボードを接続します。
たとえば、あるマシンでアプリケーション サーバーを実行している場合、JMX を使用すると、そのサーバーに関する公開された情報をリモートで表示できます。アプリケーション内の任意の変数またはメソッドを公開できる独自の JMX MBean をコーディングすることもできます。次に、公開された変数をリモートで「ポーリング」して、知りたい特定の条件をテストできます。
JMX のもう 1 つの便利な点は、その場で変数をリモートで変更できることです。たとえば、最大合計量を持つある種のプールが設定されている場合、アプリケーション サーバーの構成ファイルを再起動または変更することなく、この最大量をリモートで変更できます。
jconsole
独自のクライアント ソリューションをコーディングしなくても、MBean をリモートで簡単に表示できるように、Sun によって Java とともに提供されます。また、優れた柔軟性を提供できるカスタム ソリューションで MBean を使用することもできます。
また、JMX MBean モニタリングが組み込まれたモニタリング ソフトウェアがすでにいくつかあります。たとえば、Zenoss と Applications Manager 8 がこれを行います。
添加:
JMX を利用するソフトウェアはすでにたくさんあります。Tomcat は jconsole を介してアクセス可能な情報を公開し、JBoss Application Server も公開します。
たぶん、JSR262もここで言及する価値があります。
「JSR262は、Webサービスを使用してJMXインストルメンテーションをリモートで使用できるようにするJMXリモートAPIのコネクタを定義します。クライアントはJavaアプリケーションである必要はありませんが、使用できます。」
JSR 262は次のJavaバージョン(Java 7)の一部になる可能性が非常に高いです。
WiseManプロジェクトに依存するJMXWSコネクタ用のjava.netプロジェクトがあります。Wisemanは、WS-Management標準のオープンソースJava実装です。
ここにいくつかの適切な Web リソースがあります。
または、ここ StackOverflow のJMX タグ wikiを参照してください。数日前に更新して、あなたが求めていた内容のほとんどをリストし、いくつかの追加情報を提供しました。
これらは、JMX を最初に読んだときに読んだ 2 つです。
Sun チュートリアル: http://java.sun.com/docs/books/tutorial/jmx/index.html
春 2.5/JMX: http://static.springframework.org/spring/docs/2.5.x/reference/jmx.html