WildFlyのJMXへスクリプトからアクセスする
監視などの目的でGUIなJConsoleではなく、スクリプトからJMXへアクセスしたいことがあります。JBoss AS 6まではtwiddleというコマンドベースのJMXクライアントが付属しましたがAS7やWildFlyには付属していません。さてどうするか、ということでいくつか手段があります。
Jolokia
JolokiaはJMX over HTTPを提供するツールです。RESTでJMXアクセスできます。WildFlyではwar版を利用するのが一番簡単でしょう。
$ curl http://localhost:8080/jolokia-war-1.2.0/exec/java.lang:type=Memory/gc {"timestamp":1397463592,"status":200,"request":{"operation":"gc","mbean":"java.lang:type=Memory","type":"exec"},"value":null} $ curl http://localhost:8080/jolokia-war-1.2.0/read/java.lang:type=Memory/HeapMemoryUsage {"timestamp":1397463683,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"HeapMemoryUsage","type":"read"},"value":{"max":510066688,"committed":510066688,"init":536870912,"used":30441040}}
Jmxterm
JmxtermというJMX Remotingを使うCLIのJMXツールがあります。WildFlyでJMX Remotingを利用してリモート接続するにはjboss-cli-client.jarがクラスパスに必要なので、クラスパスの変更ができないjava -jarでJmxtermを起動してはいけません。
$ java -classpath ./jmxterm-1.0-alpha-4-uber.jar:$WFLY_HOME/bin/client/jboss-cli-client.jar org.codehaus.classworlds.uberjar.boot.Bootstrapper -l "service:jmx:http-remoting-jmx://localhost:9990"
JBoss EAP6の場合はhttp-remoting-jmxではなくremoting-jmxで、ポートが9999になります。
JRuby
一番ラクだし自由度も高いので個人的にはやっぱりJRubyです。$WFLY_HOME/binに置いてjrubyで実行。
require 'java' require 'client/jboss-cli-client.jar' java_import 'javax.management.remote.JMXConnectorFactory' java_import 'javax.management.remote.JMXServiceURL' host_name = "localhost" port = 9990 jmx_service_url = JMXServiceURL.new("service:jmx:http-remoting-jmx://#{host_name}:#{port}") environment = {} # empty hash jmx_connector = JMXConnectorFactory::connect(jmx_service_url, environment) conn = jmx_connector.getMBeanServerConnection() puts conn.getMBeanCount() jmx_connector.close
$ jruby jmx.rb 857