Quitada ブログ HAX

Hatena Blog でも Quitada ブログ

Apache Geode で個別に JMX マネージャーを起動する Java API

Apache Geode は分散システムの管理とか稼働状況監視のため、デフォルトでは一番最初に起動したロケーターが JMX マネージャーになります。

で、JMX マネージャーになっているロケーターがダウンしてしまうと、自動的に他のロケーターとかが JMX マネージャーになるのかと思いきや、ならないんですねー。ぐはぁ。つまり、JMX マネージャーがいない状態が続くわけで(ダウンしたロケーターを再起動したら、またそれが JMX マネージャーになりますが)。

JMX マネージャーがいない状態で、稼働中のロケーターのどれかを JMX マネージャーに任命するには、対象ロケーターに gfsh connect コマンドで接続してやればよいようです。gfsh connect コマンドは、本来は分散システムに接続するコマンドですが、副作用として、対象分散システムに JMX マネージャーがいなかったら接続先ロケーターを JMX マネージャーにするようで。で、ふとこの "副作用" だけを実行する Java API とかないかなーと思って、Javadoc みたけどなくて、gfsh connect 周りのソースコードみたら JmxManagerLocatorRequest.send() が副作用みたいです。

特にキャッシュとか生成する必要もなく、以下のように JmxManagerLocatorRequest とかをインポートした普通の Java プログラムから呼び出して、副作用を享受できるようです。

package quitada;

import org.apache.geode.management.internal.JmxManagerLocatorRequest;
import org.apache.geode.management.internal.JmxManagerLocatorResponse;

import java.io.IOException;

/**
 * Created by quitada on 2017/04/04.
 */
public class GeodeJMXConnectionRequestTest {
    public final static String locatorHost = "192.168.1.21";
    public final static int locatorPort = 55221;
    public final static int msTimeout = 100000;
    
    public static void main(String[] args) {
        try {
            JmxManagerLocatorResponse response
                = JmxManagerLocatorRequest.send(locatorHost, locatorPort, msTimeout);
            System.out.println("The JMX Manager is running here: " + response.getHost()
                + " -> JMX Manager port=" + response.getPort());
        } catch (IOException ioe) {
            System.err.println("Can't connect to the target locator: " + locatorHost
                + "[" + locatorPort + "]");
            ioe.printStackTrace();
        }
    }
}