RMIについて書いたエントリで、かつのりさんに↓みたいに教えてもらった。
RMIだとAPIが低レベル過ぎて面倒ですよね。
最近はリモート処理をやる為にJMXを使っています。
JMXは管理用APIとはいえ、リモート処理のフレームワークでもあります。
MBeanだとかMXBeanだとかは噂には聞いてたけど、さらっと流し読みしかしたことない。
体調不良で遠出も出来ないので早速調べて見た!!
まずはMXBean
とりあえず、MXBeanが無いことには始まらない。
MXBeanが、RMIでやったサンプルでいうRemoteインターフェイスを拡張してRemoteExceptionっていう例外を出すメソッドを定義するという、ちょっといけてない感じだった奴にあたる。
調べて見ると定義は簡単。名前付けを守るか、@MXBeanみたいにアノテーションをつければOK。
さくっとインターフェイスの定義を書く。
package kazuki.jmx;
import javax.management.MXBean;
@MXBean
public interface HelloWorld {
String sayHello();
}
うむ。シンプルになったではないか。
実装側もさくっと書く。
package kazuki.jmx;
public class HelloWorldImpl implements HelloWorld {
public String sayHello() {
return "Hello world";
}
}
これもシンプル。
MXBeanを登録してみよう
MXBeanが出来たので登録してみようと思う。
とりあえずコードは↓のような感じ。
package kazuki.jmx;
import java.lang.management.ManagementFactory;
import java.rmi.registry.LocateRegistry;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
public class Server {
public static String ADDRESS = "service:jmx:rmi:///jndi/rmi://localhost/hello";
public static void main(String[] args) throws Exception {
LocateRegistry.createRegistry(1099); // 行きつく先はRMIなのです
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("kazuki.jmx:type=HelloWorld");
server.registerMBean(new HelloWorldImpl(), name); // kazuki.jmx:type=HelloWorldで登録
JMXServiceURL url = new JMXServiceURL(ADDRESS); // MBeanServerを外から呼べるようにしてます
JMXConnectorServer connector = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
connector.start(); // 開始!
System.out.println("start...");
}
}
次はクライアント側
サーバ側が出来たので、次はクライアント側。
これは、サーバにコネクションを確立してからごにょごにょっとやる感じ。
コードだとこんなん。
package kazuki.jmx;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class Client {
public static void main(String[] args) throws Exception {
JMXServiceURL url = new JMXServiceURL(Server.ADDRESS); // サーバへのURL
JMXConnector connector = JMXConnectorFactory.connect(url); // URLから接続してくれる人を作る
MBeanServerConnection conn = connector.getMBeanServerConnection(); // コネクションを取得
ObjectName name = new ObjectName("kazuki.jmx:type=HelloWorld"); // 登録されてるオブジェクトに対して
String ret = (String) conn.invoke(name, "sayHello", null, null); // sayHelloを呼び出し!
System.out.println(ret); // HelloWorld
}
}
実行すると、HelloWorldってでます!!
ちゃんと動いてる!