Oracle WebLogic Server 11gで JRubyとJMXを使用する方法

作成:Pas Apicella    

2011年4月公開

現在Java SEプラットフォームに含まれているJMXテ クノロジーは、デバイス、アプリケーション、およびサービス駆動型のネットワークを管理および監視することを目的とした、モジュール方式の豊富で動的なソ リューションを構築するツールを提供します。

この記事では、JRubyプログラミング言語とJMXを使用して、Oracle WebLogic Server 11g Release 1の管理対象サーバーに問合せを実行し、インスタンスのランタイム情報を表示する方法について説明します。

ソフトウェア要件

以下のソフトウェアをインストールしていることが想定されます。

このサンプルは、このソフトウェアの他の一部のバージョンでも動作するはずです(ただし、他のバージョンではテストを行っていませ ん)。

デモの設定

  1. JDK 1.6がインストールされていることを確認します。
     
    $ java -version
    java version "1.6.0_23"
    Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
    Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)
  2. JRUBY_HOMEをJRubyのインストール先のディレクトリに設定し、JRubyが実行されていることを確認します。
    $ export JRUBY_HOME=$HOME/jruby-1.5.6
    $ export PATH=$PATH:$JRUBY_HOME/bin
    $ jruby -v
    jruby 1.5.6 (ruby 1.8.7 patchlevel 249) (2010-12-03 9cf97c3) (Java HotSpot(TM) Client VM 1.6.0_22) [x86-java]
  3. 以下に示すように、JRubyからJMXサポート用のjmx4r GEMをインストールします。
    $ jruby -S gem install jmx4r
    JRuby limited openssl loaded. http://jruby.org/openssl
    gem install jruby-openssl for full support.
    Successfully installed jmx4r-0.1.3
    1 gem installed
    Installing ri documentation for jmx4r-0.1.3...
    Installing RDoc documentation for jmx4r-0.1.3...
  4. GEM jmx4rが正しくインストールされていることを確認します。
    $ jruby -S gem list
    *** LOCAL GEMS ***
    columnize (0.3.1)
    jmx4r (0.1.3)
    rake (0.8.7)
    rspec (1.3.0)
    ruby-debug (0.10.3)
    ruby-debug-base (0.10.3.2)
    sources (0.0.1)
  5. 以下の図に示すように、WebLogic Serverコンソール・アプリケーションから、少なくとも1つの管理対象サーバーが属しているWebLogicドメインが接続先として設定されているこ とを確認します。 この例で使用している管理対象サーバーは、以下に示すように、ポート7003で実行されているappleと いう名前のサーバーです。
     

wls-jmx-jruby-f1

デモの実行

  1. 最初のテストでは、WebLogic内でMBean サーバーへのリモート接続を確立できることを確認します。 コード・ファイル名はtest_jmx_weblogic.rbで、 以下のコンテンツが含まれています。 MBeanサーバーは、管理アプリケーションがMBeanへアクセスするためのMBeanのリポジトリです。
    # verify JMX connection to WebLogic 11g Release 1
    require 'rubygems'
    require 'jmx4r'
    require '/u01/fmw/1034/wlserver_10.3/server/lib/wljmxclient.jar'

    java_import java.lang.System

    class VerifyWeblogicJMX

    def initialize(user, passwd, url)
    @user, @passwd, @url = user, passwd, url

    System.setProperty("jmx.remote.protocol.provider.pkgs", "weblogic.management.remote")

    @conn = JMX::MBean.establish_connection :url => url, :username => user, :password => passwd
    end

    # add getters and setters for all attrributes we wish to expose
    attr_reader :user, :passwd, :url, :conn

    def close
    @conn.close unless !@conn
    end

    def to_s
    "JMXConnection [user=#{@user}, passwd=#{@passwd}, " +
    "url=#{@url}]"
    end

    end

    username = "weblogic"
    password = "welcome1"
    url = "service:jmx:iiop://papicell-au.au.oracle.com:7003/jndi/weblogic.management.mbeanservers.runtime"

    print "Run at #{Time.now} using JRuby #{RUBY_VERSION}\n\n"

    begin
    test = VerifyWeblogicJMX.new(username, password, url)
    puts test
    puts "\nSuccessfully connected to Oracle Weblogic 10.3.x from JRuby using JMX "
    rescue
    puts "\n** Error occured **\n"
    puts "Failed executing Oracle Weblogix JMX demo from JRuby ", $!, "\n"
    ensure
    test.close
    end

    print "Ended at #{Time.now}"
  2. 以下のコード行を編集して、WebLogic Serverに接続します。 URLの形式は以下のとおりです。


    service:jmx:iiop://{hostname}:{managed-server-port}/jndi/weblogic.management.mbeanservers.runtime

    以下の行を編集して、WebLogic JMXクライアント側のJARファイルを使用するようにします。 このファイルは、$WLS_HOME/server/libディレクトリにあります。 '/u01/fmw/1034/wlserver_10.3/server/lib/wljmxclient.jar'が必要です。サーバーの正しい接続 資格証明を指定していることを確認します。
    username = "weblogic"
    password = "welcome1"
    url = "service:jmx:iiop://papicell-au.au.oracle.com:7003/jndi/weblogic.management.mbeanservers.runtime"
  3. 以下に示すように、JRubyを使用してtest_jmx_connection.rbを実行します。
    $ jruby test_jmx_weblogic.rb
    Run at Thu Mar 31 08:09:49 +1100 2011 using JRuby 1.8.7
    JMXConnection [user=weblogic, passwd=welcome1,
    url=service:jmx:iiop://papicell-au.au.oracle.com:7003/jndi/weblogic.management.mbeanservers.runtime]
    Successfully connected to Oracle Weblogic 10.3.x from JRuby using JMX
    Ended at Thu Mar 31 08:09:50 +1100 2011
  4. 接続できるようになりました。MBeanで問合せを実行するだけで、JVMの実行に関するランタイム統計を取得できます。 プログラムによって次の処理が実行されます。
    • JMXを使用してWebLogic管理対象サーバーに接続する。
    • 次の名前を使用して、MBeanで検索/問合せを実行する。 - com.bea:ServerRuntime=apple,Name=apple,Type=JVMRuntime
    • ループに入り、MBeanデータの各リクエストの間で30秒間、一時停止する。
    コード・ファイル名はmonitor-mbean.rbで、以下のコンテンツが含まれています。
    require 'rubygems'
    require 'jmx4r'
    require '/u01/fmw/1034/wlserver_10.3/server/lib/wljmxclient.jar'
    java_import 'javax.management.ObjectName'
    java_import java.lang.System
    def display_array (value)
    data = ""
    value.each do |x|
    data += "\n\t" + x.to_s
    end
    return data
    end
    # method used to check if the attribute data contains an array of data and make some sort of effort
    # to display it as text. This is quick and dirty way to do this but generally works for most array # attribute values. If not an array it simply display the attribute value as a string
    def display_attribute_data(conn, object_name, attribute) s = conn.get_attribute object_name, attribute
    search_str = s.to_s
    if (/^\[Ljava.lang.String/.match(search_str)) or
    (/^\[I/.match(search_str)) or
    (/^\[Ljavax.management.ObjectName/.match(search_str))
    # we have a array with data
    return display_array s
    end
    return s;
    end
    class JMXConnection
    def initialize(user, passwd, url)
    @user, @passwd, @url = user, passwd, url
    System.setProperty("jmx.remote.protocol.provider.pkgs", "weblogic.management.remote")
    @conn = JMX::MBean.establish_connection :url => url, :username => user, :password => passwd
    end
    # add getters and setters for all attrributes we wish to expose
    attr_reader :user, :passwd, :url, :conn
    def close
    @conn.close unless !@conn
    end
    def to_s
    "JMXConnection [user=#{@user}, passwd=#{@passwd}, " +
    "url=#{@url}]"
    end
    end
    username = "weblogic"
    password = "welcome1"
    url = "service:jmx:iiop://papicell-au.au.oracle.com:7003/jndi/weblogic.management.mbeanservers.runtime"
    print "Run at #{Time.now} using JRuby #{RUBY_VERSION}\n\n"
    begin
    jmx_conn = JMXConnection.new(username, password, url)
    puts jmx_conn
    puts "\nSuccessfully connected to Oracle Weblogic 10.3.x from JRuby using JMX "
    wls_mbean_name = "com.bea:ServerRuntime=apple,Name=apple,Type=JVMRuntime"
    mbean = JMX::MBean.find_by_name wls_mbean_name
    java_object_name = ObjectName.new wls_mbean_name
    while (true)
    # display attributes key/values
    mbean.attributes.each do |key, value|
    puts "Name: #{value}, Value: #{display_attribute_data jmx_conn.conn, java_object_name, value}\n"
    end
    # sleep for 30 seconds
    puts "\nSleeping for 30 seconds....\n"
    sleep 30
    end
    rescue
    puts "\n** Error occured **\n"
    puts "Failed executing Oracle Weblogix JMX demo from JRuby ", $!, "\n"
    ensure
    jmx_conn.close
    end
    print "Ended at #{Time.now}\n"
  5. 以下の行を編集して、WebLogic JMXクライアント側のJARファイルを使用するようにします。 このファイルは、$WLS_HOME/server/libディレクトリにあります。
    require '/u01/fmw/1034/wlserver_10.3/server/lib/wljmxclient.jar'
    サーバーの正しい接続資格証明を指定していることを確認します。
    username = "weblogic"
    password = "welcome1"
    url = "service:jmx:iiop://papicell-au.au.oracle.com:7003/jndi/weblogic.management.mbeanservers.runtime"
  6. 以下のような出力を確認します。 各繰り返しの後で、管理対象サーバーJVMの負荷に応じて"HeapFreePercent"や"HeapFreeCurrent"などの属性が変化しま す (注: 見やすくするため、"ThreadStackDump"の大部分のスレッド・ダンプ属性データを省略しています)。
    $ jruby monitor-mbean.rb

    Run at Mon Apr 04 10:26:46 +1000 2011 using JRuby 1.8.7

    JMXConnection [user=weblogic, passwd=welcome1,
    url=service:jmx:iiop://papicell-au.au.oracle.com:7003/jndi/weblogic.management.mbeanservers.runtime]
    Successfully connected to Oracle Weblogic 10.3.x from JRuby using JMX
    Name: Parent, Value: com.bea:Name=apple,Type=ServerRuntime
    Name: Uptime, Value: 2772452
    Name: HeapFreePercent, Value: 90
    Name: JavaVersion, Value: 1.6.0_22
    Name: Type, Value: JVMRuntime
    Name: ThreadStackDump, Value: "[STANDBY] ExecuteThread: '3' for queue:
    'weblogic.kernel.Default (self-tuning)'" waiting for lock weblogic.work.ExecuteThread@1f2caf4 WAITING
    java.lang.Object.wait(Native Method)
    java.lang.Object.wait(Object.java:485)
    weblogic.work.ExecuteThread.waitForRequest(ExecuteThread.java:160)
    weblogic.work.ExecuteThread.run(ExecuteThread.java:181)

    "DynamicListenThread[Default[1]]" RUNNABLE native
    java.net.PlainSocketImpl.socketAccept(Native Method)
    java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390)

    .....

    Name: OSVersion, Value: 5.10
    Name: JavaVendor, Value: Sun Microsystems Inc.
    Name: HeapFreeCurrent, Value: 210922280
    Name: OSName, Value: SunOS
    Name: Name, Value: apple
    Name: HeapSizeMax, Value: 518979584
    Name: JavaVMVendor, Value: Sun Microsystems Inc.
    Name: HeapSizeCurrent, Value: 259522560

    Sleeping for 30 seconds....

    Name: Parent, Value: com.bea:Name=apple,Type=ServerRuntime
    Name: Uptime, Value: 2802565
    Name: HeapFreePercent, Value: 90
    Name: JavaVersion, Value: 1.6.0_22
    Name: Type, Value: JVMRuntime
    Name: ThreadStackDump, Value: "[STANDBY] ExecuteThread: '3' for queue:
    'weblogic.kernel.Default (self-tuning)'" waiting for lock weblogic.work.ExecuteThread@1f2caf4 WAITING
    java.lang.Object.wait(Native Method)

    .......

    Name: OSVersion, Value: 5.10
    Name: JavaVendor, Value: Sun Microsystems Inc.
    Name: HeapFreeCurrent, Value: 210225232
    Name: OSName, Value: SunOS
    Name: Name, Value: apple
    Name: HeapSizeMax, Value: 518979584
    Name: JavaVMVendor, Value: Sun Microsystems Inc.
    Name: HeapSizeCurrent, Value: 259522560

    Sleeping for 30 seconds....
  7. [CTRL]+[C]を使用してプログラムを終了します。

これで、JRubyとJMXを使用してWebLogic Serverにアクセスする方法を習得しました。 このような設定を使用して、属性値を動的に確認したり、属性値が期待値よりも高い場合や低い場合に管理者に通知したりすることができます。