[WLS] Oracle WebLogic RESTful Management Services: From Command Line to JavaFX

原文はこちら。
http://www.oracle.com/technetwork/articles/soa/oliveira-wls-rest-javafx-1723982.html

作者について
William Markito Oliveira
ブラジルのOracle Platform Technology SolutionsチームのSenior Technologist。ミドルウェア、SOA、Javaテクノロジーを主に担当。CDI、EJB 3.1、JAX-RSの記事やコードサンプルを提供する公式Java EE Tutorialのメンバーでもあります。

概要
Oracle WebLogic Server 12c はメジャーリリースで、Java EE 6、Mavenとの統合、JDK 7のサポートといったいくつかの新機能を含んでいますが、Oracle WebLogic Serverのドメインを管理・監視する上で重要な追加機能も含まれています。本記事ではそのような機能の一つである、RESTful Management Serviceについて取り上げます。
Oracle WebLogic Server 12cでは、RESTfulサービスを使って、実行中のサーバインスタンスを監視できるようになりました。例えば以下のようなものを監視できます。
  • Applications
  • Clusters
  • Data Sources
  • Servers
この機能のうちもっとも関心が高い部分は、こうしたサービスを任意のRESTfulクライアント(異なるプログラミング言語のクライアントを含む)から呼び出せることでしょう。この記事では以下のツールを使って監視タスクを実行する方法をご紹介します。
  • 組み込みWebクライアント
  • cURL
  • Pythonスクリプト
  • JavaFXアプリケーション
他のツールからも利用できますが、詳細をご紹介するのはこの記事の範囲を超えてしまいます。完全なAPIのリファレンスや詳細を知りたい方は、Oracle WebLogic Serverのドキュメントをご覧下さい。この記事の[参考資料]にまとめておきました。

必要なもの

  • Oracle WebLogic Server 12c
  • Python 2.7+
  • JDK 7u04 (JavaFXをビルトインサポートしているもの)
  • 任意のOS(UNIXライクなOS、LinuxやOSXなどが望ましい)
RESTful Management Servicesを使うため、この機能をOracle WebLogic Administration Consoleで有効にしましょう。
  1. [ドメイン構造]>ドメイン名をクリック
  2. [構成]>[全般]>[詳細]をクリック
  3. [RESTful管理サービス]のチェックボックスをONにして保存

  1. サーバを再起動します。再起動時に以下のような出力を確認できるはずです。
<2012/08/12 16時59分29秒 JST> <Notice> <WebLogicServer> <BEA-000360> <The server started in RUNNING mode.> 
<2012/08/12 16時59分29秒 JST> <Warning> <Server> <BEA-002611> <The hostname "javelin.local", maps to multiple IP addresses: 172.16.80.50, fe80:0:0:0:cabc:c8ff:fe9a:eff6%4.> 
8 12, 2012 4:59:31 午後 com.sun.jersey.api.core.PackagesResourceConfig init
情報: Scanning for root resource and provider classes in the packages:
  weblogic.management.rest.resources
  weblogic.management.rest.provider
8 12, 2012 4:59:31 午後 com.sun.jersey.api.core.ScanningResourceConfig logClasses
情報: Root resource classes found:
  class weblogic.management.rest.resources.ApplicationResource
  class weblogic.management.rest.resources.DataSourceResource
  class weblogic.management.rest.resources.ClusterResource
  class weblogic.management.rest.resources.TestResource
  class weblogic.management.rest.resources.ServerResource
8 12, 2012 4:59:31 午後 com.sun.jersey.api.core.ScanningResourceConfig logClasses
情報: Provider classes found:
  class weblogic.management.rest.provider.CollectionResponseJsonProvider
  class weblogic.management.rest.provider.CollectionResponseXmlProvider
  class weblogic.management.rest.provider.ItemResponseJsonProvider
  class weblogic.management.rest.provider.ItemResponseHtmlProvider
  class weblogic.management.rest.provider.CollectionResponseHtmlProvider
  class weblogic.management.rest.provider.ItemResponseXmlProvider
8 12, 2012 4:59:32 午後 com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
情報: Initiating Jersey application, version 'Jersey: 1.9 09/02/2011 11:17 AM'

RESTful管理サービス
共通のフォーマットに従う共通のURLでRESTful管理サービスにアクセスできます
http(s)://[host]:[port]/management/tenant-monitoring/[path]
ここで、
  • host - Oracle WebLogic Serverの管理サーバを実行しているホスト
  • port - HTTP もしくは HTTPS ポート
  • path - 各リソースを識別する相対パス。例えば、サーバインスタンスへのパスはservers/AdminServer、データソースはdatasources/myDataSource…といった感じ。
サービスの実装はJersey(JAX-RSの参照実装)ベースで、以下の結果表現をサポートしています。
  • JSON ("application/json")
  • XML (""application/xml")
  • HTML
デフォルトの出力はHTMLですが、APIを呼び出す際にAccept: HTTPヘッダを特定することにより振る舞いを変更することができます。APIの詳細や、各リソースが取り出す値や属性の完全なリファレンスはOracle WebLogic Serverのドキュメントから入手できます。この記事の[参考資料]にまとめてあります。
次は、RESTクライアントの例をご紹介しましょう。こうしたサービスに任意のWebブラウザからアクセスできることに言及しておくことは重要なことと考えています。例えば、RESTfulサービスを現在実行中のWebLogic Serverのドメインで有効にした後、以下のURLをブラウザに入力して下さい。
http://localhost:7001/management/tenant-monitoring/servers
[注意]このURLに最初にアクセスするときに、ユーザ名とパスワードの入力を求められます。AdministratorsグループもしくはMonitorsグループに属するユーザのみがRESTful管理サービスにアクセスできます。
この記事ではデフォルトユーザ名 weblogic とパスワード welcome1 を使います。
認証が通ると、ブラウザ出力は以下のような感じになっているはずです。

前述の通りデフォルトの出力はHTMLなので簡単なHTMLページです。

「隠された」ネイティブクライアント
Oracle WebLogic Server 12cには組み込みWebクライアントも含まれています。これを使ってサービスを呼び出すことができます。このWebクライアントは種々の出力フォーマット(XML、JSON、HTML)をサポートしています。
[注意]クライアントはテスト目的のためだけに使って下さい。サポート対象外です。
このクライアントには以下のURLでアクセスできます。
http://localhost:7001/management/ajaxtest.html
以下の3個の図はリソースの選択についての利用例です。

ネイティブクライアント:全サーバのリスト


ネイティブクライアント:全クラスタのリスト

ネイティブクライアント:特定のサーバ情報をXML形式でチェック

ネイティブクライアントを使うと管理コンソールよりも簡単かつ迅速に利用可能なリソースの共通情報にアクセスできます。もし必要な情報の正しいパスを知っていれば、という前提付きですが。

cURL - (libcurl)
Linux Manual によると、cURLは次のように定義されています。
"A tool to transfer data from or to a server, using one of the supported protocols (DICT, "FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP). The command is designed to work without user interaction…cURL offers a busload of useful tricks like proxy support, user authentication, FTP upload, HTTP post, SSL connections, cookies, file transfer resume and more."
"サポートされているプロトコル(DICT, "FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET、そしてTFTP)を使い、サーバから/へデータを転送するツール。コマンドはユーザインタラクションなしで動作するように設計されている…cURLは多数の有用なトリック(プロキシのサポート、ユーザ認証、FTPアップロード、HTTPのポスト、SSL接続、cookie、ファイル転送の中断·再開など)を提供します。"
実行中のOracle WebLogic Serverドメインからデータを取り出す簡単なシェルスクリプトを作るのにcURLはいいツールです。以下はcURLスクリプトのスニペットです。
コード1 - サーバ情報のチェック(RAW JSON形式で出力)
Javelin% curl -s --user weblogic -H "Accept: application/json" http://localhost:7001/management/tenant-monitoring/servers/
Enter host password for user 'weblogic':
{"body":{"items":[{"name":"AdminServer","state":"RUNNING","health":"HEALTH_OK"},{"name":"ManagedServer_1","state":"SHUTDOWN"},{"name":"ManagedServer_2","state":"SHUTDOWN"}]},"messages":[]}
コード2 - サーバの現在のフリーのヒープをチェック
Javelin% curl -s --user weblogic -H "Accept: application/json" http://localhost:7001/management/tenant-monitoring/servers/AdminServer | grep -Po '"heapFreeCurrent":[ 0-9]*'
Enter host password for user 'weblogic':
"heapFreeCurrent":152676576
コード3 - 作成されたデータベース接続の総数を表示
Javelin% curl -s --user weblogic -H "Accept: application/json" http://localhost:7001/management/tenant-monitoring/datasources/myDataSource | grep -Po '"connectionsTotalCount":[ 0-9]*'
Enter host password for user 'weblogic':
"connectionsTotalCount":10
いくつかのオプションを使うと、コマンドラインツールからの出力結果をパースすることができます。よく使われるのは、awk、sed、grepですが、新しいツールとして、jsawkという、JSONのパースに特化したものもあります。ご利用の用途にあわせて賢明な選択をして下さい。

Pythonクライアント
Pythonはアプリケーション開発者、Web開発者、システム管理者、および科学的な研究者を含む専門家の広い範囲の間で非常に人気のあるパワフルな言語です。そのパワーに加え、Pythonを学ぶのは非常に簡単で、スペースとインデントでコードの可読性を提供することに明確な目標があります。
PythonはほとんどのLinuxサーバにデフォルトでインストールされているので、多くのシステム管理者は、マシン環境(メモリ、CPU使用率、ファイルシステム、ネットワーク)を監視するPythonスクリプトを作成します。この記事では、そのリストにOracle WebLogic Serverを追加してみたいと思います。

Script #1 — サーバステータスの監視
この最初のスクリプトでは、Oracle WebLogic Serverのサーバをリスト表示し、各サーバの状態を表示します。華麗さはありませんが、このスクリプトを簡単にLinux/UNIXのcronに追加でき、特定の時間(1分、30秒)実行して全てのOracle WebLogic Serverが起動していて実行中かどうかを確認できます。この場合のREST呼び出しの応答はJSONです。PythonのJSONライブラリを使って結果を辞書やリストにパースすることができます。

コード 4 - Pythonを使ってサーバ状態をチェックする
#!/usr/bin/python
'''
Created on Jul 2, 2012 Check Weblogic Server Status @author: markito
'''
import urllib2, json

####################
# Modify the server information accordingly
####################
host = "localhost"
port = "7001"
username = "weblogic"  
password = "welcome1"
    
################################################################################
def main():

    baseURL = "http://%s:%s/management/tenant-monitoring/servers" % (host,port)
    
    # HTTP Authentication
    passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
    passman.add_password(None, baseURL, username, password)    
    authhandler = urllib2.HTTPBasicAuthHandler(passman)
    opener = urllib2.build_opener(authhandler)
    urllib2.install_opener(opener)
    
    try:
        req = urllib2.Request(baseURL, None, {'Accept': 'application/json'})
        raw = urllib2.urlopen(req).read()
        data = json.loads(raw)
        items = data['body']['items']
        
        for item in items:
            print "Server: " + item['name'] + " [ " + item['state'] + " ]" 
            
    except urllib2.HTTPError, e:
        print "HTTP error: %d" % e.code
        
    except urllib2.URLError, e:
        print "Network error: %s" % e.reason.args[1]
################################################################################
if __name__ == '__main__':
    main()
スクリプトを実行するために、上記のスクリプトをコピーして実行可能なPythonスクリプト(serverStatus.pyなど)として保存しましょう。出力結果は以下のような感じになるはずです。
Javelin% ./ServerStatus.py 
Server: AdminServer [ RUNNING ]
Server: ManagedServer_1 [ SHUTDOWN ]
Server: ManagedServer_2 [ SHUTDOWN ]
もちろん、Oracle WebLogic Scripting Tool(WLST)を使用してもほぼ同じ結果を達成できますが、いくつか考慮すべき違いがあります。
  • Python vs. JythonPythonはCで作られた多目的言語です。解釈、コンパイルされると.pycファイルを生成します。Pythonは自身でガベージコレクション実装も有しています。Jythonは100%Javaで書かれたPythonの移植版で、任意のJVMで実行できます。コンパイルするとコードは.classファイルを生成しJavaのガベージコレクション実装を使用します。WLSTスクリプトはJythonで書かれています。
  • クラスパスが必要WLSTを実行するためには、特定のライブラリをご自身の環境に設定しなければなりません。通常の場合、WLSTスクリプトを実行する前に、<Domain_Home>/binにあるsetDomainEnv.sh/cmdスクリプトを実行する必要があります。
  • プロトコルWLSTを使うと、接続ではOracle WebLogic Server固有のプロトコルであるT3を使います。PythonとRESTを使う場合はHTTP接続です。
  • 実行Python言語は軽量です。スクリプトを何度か実行したところ、一貫してWLSTはPythonよりも時間がかかることがわかりました。
WLSTを使って、Oracle WebLogic Serverのドメインを管理(サーバーの開始、停止)したり、サーバーの設定を変更したり、新しいリソース(データソース、JMSキューなど)を作成できることに注意してください。このリリースでは、Oracle WebLogic RESTful管理サービスは厳密に監視のみに限定されていて、サーバー上の任意の値を更新したり変更したりすることはできません。

コード5 - サーバ状態のチェックする(WLST版)
'''
Created on Jul 4, 2012 @author: Markito @file: serverStatusWLST.py
'''

####################
# Modify the server information accordingly
####################
username = 'weblogic'
password = 'welcome1'
URL='t3://localhost:7001'

################################################################################
connect(username,password,URL)
domainConfig()
serverList=cmo.getServers();

domainRuntime()
cd('/ServerLifeCycleRuntimes/')

for server in serverList:
     name=server.getName()
     cd(name)
     serverState=cmo.getState()
     
     print "Server: " + name + " [ " + serverState + " ]"
     cd('..')

上記スクリプトを実行するために、serverStatusWLST.py などといった名前でファイルに保存して下さい。setDomainEnv.sh スクリプト(source setDomainEnv.shもしくは. /setDomainEnv.sh)を実行してから以下のコマンドで実行して下さい。
java weblogic.WLST serverStatusWLST.py

Script #2 — 手の込んだPythonクライアント
2個目のスクリプトには実行中のOracle WebLogic Serverのドメインの追加情報を監視するためのいくつかの追加オプションが含まれています。それは、スクリプトにOracle WebLogic Serverの固定のURL、ユーザ名またはパスワードを持っておらず、以前のスクリプトよりも安全であるの点に注意することが重要です。監視したいリソースのタイプを含めて、すべてをスクリプトにパラメータとして渡します。
  • -h または --host: Oracle WebLogic 管理サーバのアドレス
  • -u または --user: 認証のためのユーザ名
  • -p または --password: パスワード
  • -s または --server: サーバの監視
  • -d または --datasource: データソースの監視
  • -a または --application: アプリケーションの監視
  • -c または --cluster: クラスタの監視
コード6 - 多くの監視オプションを追加したPythonスクリプト
#!/usr/bin/python
''' Created on Jun 26, 2012 @author: Markito @file: WLSTRESTPy.py '''
import getopt, sys, getpass
import urllib2

__version__ = 0.1

def main():
    
    wls = WLSREST()
    
    try:
        opts, args = getopt.getopt(sys.argv[1:], "h:o:u:pvs:d:a:c", 
["host=", "output=", "user=","password","version", "server=",
 "datasource=", "application=", "cluster="])
    except getopt.GetoptError, err:
        print str(err)
        wls.usage()
        sys.exit(2)
        
    ###############
    ## iterate and parse each parameter and input value
    ###############
    for opt, value in opts:
        if (opt in ('-v', '--version')):
            print 'Version %(v)s' % {'v':  __version__ }
            
        elif (opt in ('-h', '--host')):
            host = value
            wls.baseURL = "%s/management/tenant-monitoring/" % (host)     
                  
        elif (opt in ('-p', '--password')):
            wls.password = getpass.getpass("Password: ")
   
        elif (opt in ('-u', '--user')):
            wls.username = value
    
        elif (opt in ('-s', '--server')):
            wls.checkServer(value)
            
        elif (opt in ('-d', '--datasource')):
            wls.checkDataSource(value)
            
        elif (opt in ('-a', '--application')):
            wls.checkApplication(value)
            
        elif (opt in ('-c', '--cluster')):
            wls.checkCluster(value)
        else: 
            wls.usage()
            
    ###########
    # Simple print the results but could parse it from here or from 
    # each wls monitoring method (checkServer, checkCluster...)
    ###########
    print wls.GET()
        

''' WLSRest class that encapsulate the monitoring methods,
authentication and GET call  ''' 
class WLSREST():
     
    def setURL(self, url):
        self.baseURL = url
        return self
    
    def usage(self):
        print("Please check the command options and syntax")
        print("Syntax: ./WLSRESTPy.py -h [http://adminServerHost:port]
[-sacd] [parameter] -u [username] -p")
        print("For example: ./WLSRESTPy.py -h http://localhost:7001 -s     
AdminServer -u weblogic -p")
        
    def checkServer(self, server):
        return self.setURL(self.baseURL + "servers/%s" % server)
        return self
    
    def checkDataSource(self, dataSource):
        return self.setURL(self.baseURL + "datasources/%s" % dataSource)
    
    def checkApplication(self, application):
        return self.setURL(self.baseURL + "applications/%s" % application)
        
    def checkCluster(self, cluster):
        return self.setURL(self.baseURL + "clusters/%s" % cluster)
    
    def GET(self):
        # HTTP Authentication
        passman = urllib2.HTTPPasswordMgrWithdefaultRealm()
        passman.add_password(None, self.baseURL, self.username, self.password)    
        authhandler = urllib2.HTTPBasicAuthHandler(passman)
        opener = urllib2.build_opener(authhandler)
        urllib2.install_opener(opener)
        
        try:
            data = ""
            req = urllib2.Request(self.baseURL, None, {'Accept': 'application/json'})
            data = urllib2.urlopen(req).read()
            
            return data
            
        except urllib2.HTTPError, e:
            print "HTTP error: %d" % e.code
            self.usage()
            
        except urllib2.URLError, e:
            print "Network error: %s" % e.reason.args[1]
            self.usage()
            
########################################################################
if __name__ == '__main__':
    main()
簡単のため、このスクリプトにはサービス呼び出しの応答に対する特別な取り扱いをしていません。単にJSONレスポンスを出力しているだけですが、この記事の最初のPythonスクリプトの例を見て、Pythonが提供する組み込みjsonライブラリを使ったコンテンツをパースする方法を理解してもらいたいと思います。

以下にスクリプトの呼び方を例示しておきます。
コード 7 - 全てのサーバ状態を表示 (Python)
Javelin% ./WLSRESTPy.py -h http://localhost:7001 -s ''  -u weblogic -p
Password: 
{"body":{"items":[{"name":"AdminServer","state":"RUNNING","health":"HEALTH_OK"},
{"name":"managedA","state":"SHUTDOWN"},{"name":"managedB","state":"SHUTDOWN"}]},
"messages":[]

コード 8 - サーバ情報をチェック (Python)
Javelin% ./WLSRESTPy.py -h http://localhost:7001 -s 'AdminServer' -u weblogic -p
Password: 
{"body":{"item":{"name":"AdminServer","state":"RUNNING","health":"HEALTH_OK",
"clusterName":null,"currentMachine":"","weblogicVersion":"WebLogic Server 
Temporary Patch for 13340309 Thu Feb 16 18:30:21 IST 2012\nWebLogic Server 
Temporary Patch for 13019800 Mon Jan 16 16:53:54 IST 2012\nWebLogic Server 
Temporary Patch for BUG13391585 Thu Feb 02 10:18:36 IST 2012\nWebLogic Server 
Temporary Patch for 13516712 Mon Jan 30 15:09:33 IST 2012\nWebLogic Server 
Temporary Patch for BUG13641115 Tue Jan 31 11:19:13 IST 2012\nWebLogic Server 
Temporary Patch for BUG13603813 Wed Feb 15 19:34:13 IST 2012\nWebLogic Server 
Temporary Patch for 13424251 Mon Jan 30 14:32:34 IST 2012\nWebLogic Server 
Temporary Patch for 13361720 Mon Jan 30 15:24:05 IST 2012\nWebLogic Server 
Temporary Patch for BUG13421471 Wed Feb 01 11:24:18 IST 2012\nWebLogic Server 
Temporary Patch for BUG13657792 Thu Feb 23 12:57:33 IST 2012\nWebLogic Server 
12.1.1.0  Wed Dec 7 08:40:57 PST 2011 1445491 ","openSocketsCurrentCount":1,
"heapSizeCurrent":530186240,"heapFreeCurrent":
486465744,"heapSizeMax":530186240,"javaVersion":"1.6.0_33","oSName":"Mac OS X",
"oSVersion":"10.7.4"}},"messages":[]}

コード 9 - アプリケーション情報のチェック(Python/medrecアプリケーション使用)
Javelin% ./WLSRESTPy.py -h http://localhost:7001 -a medrec -u weblogic -p
Password: 
{"body":{"item":{"name":"medrec","type":"ear","state":"STATE_NEW",
"targetStates":[{"target":"myCluster","state":"STATE_NEW"},
{"target":"AdminServer","state":"STATE_FAILED"}],"dataSources":[],
"workManagers":[],"minThreadsConstraints":[],"maxThreadsConstraints":[],
"requestClasses":[]}},"messages":[]}

JavaFXクライアント
未だにJavaFXを新しい、実験的なテクノロジーと考えている人がいるようですが、Sun MicrosystemsがJavaFXを2007年にリリースしてから、携帯電話やテレビ、自動車のシステム、ブラウザ、その他のデバイスでリッチクライアントにする強力なテクノロジーのアイデアは非常に重要になってきて、このアイデアがより一層広く受け入れられてきました。JavaFXを使って様々な面を持つ複雑なアプリケーションを作成することができます。 しかし、この次の章では、RESTful管理サービスを使うOracle WebLogic Serverの簡単な監視ツールを作る予定にしています。JavaFX初心者で何がどうなっているかをざっと見てみたい場合は、JavaFX 2 Sample ShowcaseでEnsembleというアプリケーションサンプルをご覧下さい。
JavaFXの基本を説明することはこの記事の範疇外になりますので、Oracle WebLogic Server JavaFX Monitorのサンプルを、主要コンポーネントに特化して以下で説明します。

RESTクライアント
このクライアントはJerseyのcom.sun.jersey.api.client.Clientcom.sun.jersey.api.client.WebResourceというクラスで作られ、Oracle WebLogic Serverのセキュリティレルムに対してリクエストを認証します。簡単のため、アプリケーションではJSON形式のリクエストのみを扱いますが、少し修正すれば簡単にXML、HTMLで応答を返すようにできるでしょう。

コード 10 - Java RESTクライアント
// code with some parts ommited
public class WLSClient {
…

    public final void initClient() {
        final Client client = Client.create();
        client.addFilter(new HTTPBasicAuthFilter(getUsername(), getPassword()));
        this.webResource = client.resource(getEndpoint());
    }
… 
    public ClientResponse getCall(final String uriPath) {

        if (webResource == null) {
            initClient();
        }

        final ClientResponse response = 
   webResource.path(uriPath).accept(MEDIA_TYPE).get(ClientResponse.class);

        return response;
    }
…

コマンド
REST管理サービスを呼び出して、認証を行うことができたので、監視できるいくつかのクラスがあります。それは、リソースのタイプごとに1個のクラスです。プロセスは、Commandデザインパターンに従います。クライアントによっては、こうしたクラスを異なるスレッドから呼び出すことができます。全てのコマンドはjava.util.concurrent.Callableインターフェースを実装しています。これは結果を返し、例外を投げることもあるタスクを表しています。REST呼び出しから結果をパースし、その結果をJackson JSONライブラリのorg.codehaus.jackson.map.ObjectMapperクラスを使ってjava.util.Mapオブジェクトに入れるメソッドもあります。これはこの例の全てのコマンドにおけるデフォルトの動作です。

コード 11 - 他のコマンドをベースとした抽象クラス
// code with some parts omitted
public abstract class AbstractCommand implements Callable<map> {
…
    protected AbstractCommand(WLSClient client) {
        this.client = client;
        this.mapper = new ObjectMapper();
    }
… 
    public Map parseResults(final String jsonResponse) throws JSONException,
  IOException {

        Map
コード 12 - Oracle WebLogic Serverの情報を監視できるコマンドクラスの例
// imports omitted -
public class ServerCommand extends AbstractCommand {

    private String server;

    public ServerCommand(WLSClient client, String server) {
        super(client);
        this.server = server;
    }

    public Map getServerInfo() throws WebApplicationException, JSONException,
  IOException {
        setCommandPath("/servers/" + ((server != null) ? server : ""));

        Map
コマンドをjavafx.concurrent.Servicesjavafx.concurrent.Tasksに簡単に変換します。UIスレッド(JavaFX アプリケーションスレッド)を新たなユーザイベントを処理できるようにしながら、バックグラウンドスレッドでの作業をカプセル化します。

その他のアプリケーションコンポーネント
この記事の目的はREST管理サービスゆえ、このアプリケーションの他のコンポーネントについて詳細を記載することはありません。しかし、コンポーネントのソースコード(WLSMonitor.zip)は評価目的でダウンロード頂けます。
これらのコンポーネントの概要は以下の通りです。
  • GUI
    Java FX Scene Tool(こちらからダウンロードできます)を使って、Graphical User Interface (GUI)を作成しました。 JavaFXを使ってUIを作成する方法はいくつかありますが、この記事ではGUIアクションのControllerとして、FXMLファイルとJavaクラスを使います。
oliveira-wls-rest-javafx-fig05
JavaFX Scene Tool - JavaFXアプリケーションの設計
  • ワークマネージャ
    スレッドをグループ化し、サービスリクエストの実行をよりうまく分離するために、ExecutorServiceを使って複数のコマンド呼び出しを共有します。
結果を以下のスクリーンショットで確認できます。
oliveira-wls-rest-javafx-fig06
WLSFXMonitor - 構成の設定
oliveira-wls-rest-javafx-fig07
Figure 7: WLSFXMonitor - 結果タブと履歴
oliveira-wls-rest-javafx-fig08
WLSFXMonitor - サーバの状態

まとめ
Oracle WebLogic Server 12cはアプリケーションサーバの様々な局面で使える多くの機能(RESTful管理サービスやその他の最新の監視APIなど)を集約・統合しています。
APIへのRESTfulなアクセスを提供することで、アプリケーション開発者やシステム管理者が様々なツールやプログラミング言語を使って重要な情報を収集するより多くの可能性を提供します。このコンセプトを念頭に、JavaFXや他のリッチメディアを用いたモダンなアプローチを使用すると、シンプルではあるが非常に有益な、Webブラウザやスタンドアロンクライアントで実行できるアプリケーションサーバの監視アプリケーションを作ることができます。

参考資料

0 件のコメント:

コメントを投稿