IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Autonomic computing | SOA and Web services | Java technology | XML  >

イベント作成を容易にする Muse と WEF

Apache Muse WSDM Event Format は、単純な API を使用してイベントを操作します。

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

原文はこちら

原文はこちら


レベル: 中級

Dan Jemiolo (danjemiolo@us.ibm.com), Advisory Software Engineer, IBM 

2007年 4月 03日

Web Services Distributed Management (WSDM) Event Format (WEF) は、システム管理関連のイベントを XML 形式でシリアライズする方法を記述した OASIS 標準です。この標準は、指定が必須な値、任意指定の値、およびそれぞれの意味構造を詳細にカバーしていますが、実際のシステムの実装方法については説明していません。しかし幸いなことに、Apache Muse プロジェクトには WEF が実装されており、単純な Java™ API を使用して WEF イベントを作成、送信、および受信することが可能です。この記事では、Apache Muse アプリケーション内からこれらの処理方法について解説します。

OASIS 標準である Web Services Distributed Management (WSDM) Event Format (WEF) は、システム管理イベントをシリアライズするために指定が必須な値および任意指定の値の意味構造を詳細に記述した優れたガイドです。しかし、システムの実装方法が説明されていなければ、ユーザーは何の利点も得られない、と思われるかもしれませんが、ご安心ください。Apache Muse には WEF が実装されており、単純な Java API を使用した WEF イベントの作成および送受信が可能です。このことを踏まえて、Muse アプリケーション内からこれらの処理方法を説明します。

このチュートリアルを受講する方は、Apache Muse を使用した Web サービス・エンドポイントの作成に精通していることが望まれます。また、WSDM および WEF の一般的概念を理解している必要があります。事前に WSDM および Muse の背景について詳細をお知りになりたい方は、「参考文献」セクションにあるリンクをご参照ください。

Documents to help
These documents could come in handy while you're experimenting with the tasks in this article:

WEF イベントの作成

Muse フレームワークには、WEF イベントの作成および操作のための、JavaBean に似た API が含まれています。「JavaDoc for the WEF API」(「参考文献」セクション参照) を読むと、ほぼすべての WEF フィールドは JavaBean コンポーネントで表されており、サブフィールドはそれぞれ get()ter メソッドおよび set()ter メソッドで表されているのがわかります。WEF ファクトリー (「参考文献」のリンク参照) は、この API の中で唯一、get()ter および set()ter よりも複雑なもので、広範な create() メソッドを提供します。これにより、特定の実装クラスへの従属関係を生じることなくイベントの一部をインスタンス化することが可能になります。

WEF イベントの作成方法を説明すると、まず空のイベントを作成し、そこにコードを追加していくことにより、サーバーの起動という共通の IT イベントが完全に記述されます。まず、イベントの作成および表示を実行できる単純な Java プログラムを (main() コマンドを使用して) 作成します。これには、リスト 1 に示すコードを作成すれば十分です。


リスト 1. 単純な Java プログラムの作成
                
import org.apache.muse.ws.dm.muws.events.*;
import org.apache.muse.ws.dm.muws.events.impl.SimpleWefFactory;

public class Test
{
    public static void main(String[] args)
    {
    	System.out.println();
    }
}

コードをコンパイルして実行する前に、クラスパスに以下の JAR ファイルがあることを確認してください。

  • muse-wsdm-wef-api.jar
  • muse-wsdm-wef-impl.jar
  • muse-util-xml.jar

このテスト・アプリケーションの準備が整ったら、コードを追加します。

必須フィールドの設定

イベント作成に向けた第 1 ステップは、WEF ファクトリーのインスタンス化です。これは、唯一のWEF実装内に対する参照となります。すべてのオブジェクト作成はファクトリーが行うため、コードを変更することなく Muse の WEF 実装クラスをユーザー自身のクラスに置き換えることができます。この場合、Muse の実装を使用するため、org.apache.muse.ws.dm.muws.events.impl.SimpleWefFactory クラスを使用します。

ファクトリー・オブジェクトの準備が整ったら、WEF のすべてが作成可能になります。まずは、すべての WEF イベントのルート要素である ManagementEvent から始めます。リスト 2 は、ファクトリー・オブジェクトを使用して空のイベントを作成する方法を示しています。


リスト 2. ファクトリー・オブジェクトの使用による、空のイベントの作成
                
import org.apache.muse.ws.dm.muws.events.*;
import org.apache.muse.ws.dm.muws.events.impl.SimpleWefFactory;

public class Test
{
    public static void main(String[] args)
    {
        WefFactory factory = new SimpleWefFactory();
        
        ManagementEvent event = factory.createEvent();
        
    	System.out.println(event);
    }
}

空のイベントを作成してコンソールに表示すれば、プログラムには単に <ManagementEvent/> エレメントが表示されると思われるでしょう。しかし、実際には次のようなエラーが表示されます。

java.lang.RuntimeException: [ID = "NoSourceComponent"] The WEF 
event has no source component. The source component field is required by 
the WEF schema.

ここで慌ててはいけません。これでよいのです。Muse の WEF 実装は、シリアライズまたは構文解析するイベントがすべて WSDM 標準に準拠していることを確認するのです。このイベントには必須フィールドが含まれていないため、XML にシリアライズすることができません (実際には数多くの必須フィールドがありますが、最初のエラーが起こると Muse は処理を停止します)。そこで、プログラムの実行およびイベントの表示に最低限必要な必須フィールドを 1 つずつ追加していきます。

リスト 3 は、ソース・コンポーネント のイベントへの追加方法を示します。ソース・コンポーネントとは、イベントを生成したリソースのアドレスを指します (レポーター・コンポーネント はイベントを公開したリソースのアドレスです。ソース・コンポーネントとレポーター・コンポーネントは同一のリソースである場合がよくあります)。すべての OASIS Web サービス標準は WS-Addressing を使用してリソースの場所を検索するため、ソース・コンポーネントにエンドポイント・リファレンス (EPR) を挿入する必要があります。


リスト 3. イベントへのソース・コンポーネントの追加
                
//
// create the source component wrapper
//
Component source = factory.createComponent();

source.setName(WefConstants.SOURCE_COMP_QNAME);
source.setResourceID("1234-56-7890");

//
// create the EPR that will go in the wrapper
//
URI sourceURI = URI.create("http://localhost/my-resources/services/event-publisher");
EndpointReference sourceEPR = new EndpointReference(sourceURI);
Element eprXML = sourceEPR.toXML();

//
// add the EPR to the source wrapper
//
ComponentAddress sourceAddress = factory.createComponentAddress();
sourceAddress.addExtendedElement(eprXML);
source.setAddress(sourceAddress);

//
// add the source info to the event
//
event.setSource(source);

リスト 3 のコードを追加したら、テスト・アプリケーションを構築および実行します。これで WEF イベントのフォーマット設定は完了です。


リスト 4. フォーマット済み WEF イベント
                
<muws1:ManagementEvent 
    xmlns:muws1="http://docs.oasis-open.org/wsdm/muws1-2.xsd" 
    ReportTime="2007-03-07T15:15:58-05:00">
    <muws1:EventId>uuid:182bef3c-b098-c4f8-1105-a3c25bc30fe6</muws1:EventId>
    <muws1:SourceComponent>
        <muws1:ComponentAddress>
            <wsa:EndpointReference 
                xmlns:wsa="http://www.w3.org/2005/08/addressing">
                <wsa:Address>
                    http://localhost/my-resources/services/event-publisher
                </wsa:Address>
            </wsa:EndpointReference>
        </muws1:ComponentAddress>
        <muws1:ResourceId>1234-56-7890</muws1:ResourceId>
    </muws1:SourceComponent>
</muws1:ManagementEvent>

既にお気付きかもしれませんが、イベントにフィールドを 1 つ追加しただけでもプログラムは動作します (追加する必須フィールドは数多くあると先に述べましたが)。この XML 構文をよく見てみると、Muse が合理的なデフォルト値を使用して、EventIdReportTime という別の必須フィールドを追加したのがわかります (それぞれ現在時刻とランダム UUID を示します)。これらの値は ManagementEvent.setEventId() メソッドおよび Management.setReportTime() メソッドを使用して自由に修正できますが、ほとんどのユーザーはデフォルト値のままで問題ありません。

次の手順に進む前に、ManagementEvent.setReporter() メソッドを試してみるのも良いかもしれません。これは setSource() メソッドとまったく同じですが、ユーザーによって提供される EPR は、<muws1:SourceComponent/> ではなく、<muws1:ReporterComponent/> でシリアライズされます。

これで標準に準拠したイベントを作成できましたが、まだ完了ではありません。作成したイベントがどのような状態を表すのか、詳細をさらに追加する必要があります。

Situationフィールドの設定

WEF のSituationフィールドは、最も興味のあるデータが保存される場所です。イベントのカテゴリー、メッセージ、およびイベント処理を行うソフトウェア (および私たち人間) が必要とするその他の有用な情報が保存されます。ここでも Muse は、作成された <muws2:Situation/> のシリアライズを試みる前に、それが有効であるかを確認します。

リスト 5 に示すコードでは、定義済みの WSDM 値を使用してsituationのカテゴリーを記述しており、また、ログ・ファイルの一部としてのイベントを閲覧する管理者にとって役立つメッセージを提供しています。


リスト 5. 有効な <muws2:Situation/> の作成の必要性
                
//
// add a situation that describes a server starting
//
Situation situation = factory.createSituation();
situation.setCategoryType(WefConstants.START_SITUATION_QNAME);
situation.setPriority(Situation.LOW_PRIORITY);
situation.setSeverity(Situation.INFO_SEVERITY);
situation.setSuccessDisposition(Situation.SUCCESSFUL);
situation.setMessage("The application 'server1' started successfully.");

event.setSituation(situation);

この新しいコードを追加してテスト・プログラムを実行すると、以下のイベント XML が表示されます (situationに関連するフラグメントは太字表示)。


リスト 6. イベント XML (状態関連の部分は太字表示)
                
<muws1:ManagementEvent
    xmlns:muws1="http://docs.oasis-open.org/wsdm/muws1-2.xsd" 
    ReportTime="2007-03-07T15:43:48-05:00">
    <muws1:EventId>uuid:25e00dbd-ec20-64b1-e53f-59569c1780d9</muws1:EventId>
    <muws1:SourceComponent>
        <muws1:ComponentAddress>
            <wsa:EndpointReference 
                xmlns:wsa="http://www.w3.org/2005/08/addressing">
                <wsa:Address>
                    http://localhost/my-resources/services/event-publisher
                </wsa:Address>
            </wsa:EndpointReference>
        </muws1:ComponentAddress>
        <muws1:ResourceId>1234-56-7890</muws1:ResourceId>
    </muws1:SourceComponent>
    <muws2:Situation 
        xmlns:muws2="http://docs.oasis-open.org/wsdm/muws2-2.xsd">
        <muws2:SituationCategory>
            <muws2:StartSituation/>
        </muws2:SituationCategory>
        <muws2:SuccessDisposition>Successful</muws2:SuccessDisposition>
        <muws2:SituationTime>2007-03-07T15:43:48-05:00</muws2:SituationTime>
        <muws2:Priority>10</muws2:Priority>
        <muws2:Severity>1</muws2:Severity>
        <muws2:Message>
            The application server 'server1' started successfully.
        </muws2:Message>
    </muws2:Situation>
</muws1:ManagementEvent>

これで、単純な Java アプリケーションでイベントを作成できるようになりました。では次に、そのスキルを実際の WSDM エンドポイントに活用して、標準の通知手段としてのイベントを作成します。

WEF イベントの公開

これまでに作成したコードを使用して、Muse ベースのアプリケーションのどこからでもイベントを作成できます。通常、イベント・オブジェクトは、実際にシステムに起こったイベントに対応して生成されます。Muse のCapabilityクラスで作成したロジックを追加してイベント・オブジェクトを作成し、これを WS-Notification (WSN) を使用して公開することができます。以下の行を追加するだけで、Capabilityコード内から WSN を使用してイベントを公開することができます。

ManagementEvent event = ...     // as before

NotificationProducer wsn = getResource().getCapability(WsnConstants.PRODUCER_URI);
wsn.publish(WefConstants.START_SITUATION_QNAME, event);

NotificationProducer.publish() メソッドを呼び出すと、Muse の WSN 実装がイベントを XML にシリアライズし、WSN 通知メッセージ内にパッケージングし、そのイベントに関心を持つコンシューマー宛てに送信します。独自の WSDM エンドポイントを作成せずにテストを迅速に実行したい場合は、Muse に同梱されている wsn-producer サンプル・プロジェクトを修正して WEF イベントを公開してください。イベントが公開されると、サーバーのトレース・ログで確認できます。

WEF イベントの受信および構文解析

コンシューマーの立場からすると、イベント XML の構文解析は、イベント・オブジェクトをゼロから作成するよりもずっと容易なことです。WSN NotificationConsumerを実装しているリソースがある場合、メッセージ・リスナーを追加することで、受信する通知を処理して、WEF APIを使用してそのペイロードの構文解析を行うことが可能です。リスト 7 は、通知から WEF を抽出してコンソールに表示するメッセージ・リスナーを示しています。


リスト 7. 通知から WEF を抽出してコンソールに表示するメッセージ・リスナー
                
import org.apache.muse.ws.dm.muws.events.*;
import org.apache.muse.ws.dm.muws.events.impl.SimpleWefFactory;
import org.apache.muse.ws.notification.NotificationMessageListener;

public class MyListener implements NotificationMessageListener
{
    public boolean accepts(NotificationMessage message)
    {
        return true;
    }
    
    public void process(NotificationMessage message)
    {
        WefFactory factory = new SimpleWefFactory();
        
        Iterator i = message.getMessageContentNames().iterator();
        
        while (i.hasNext())
        {
            QName payloadName = (QName)i.next();
            Element payload = message.getMessageContent(payloadName);
            
            ManagementEvent event = factory.createEvent(payload);
            
            System.out.println(event);
        }
    }
}

ご覧のように、イベントをゼロから作成するときに使用するのと同じファクトリーの create() メソッドを使用し、XML を構文解析してオブジェクトに変換できます。これで、イベント・オブジェクトの get()ter メソッドを使用してイベントの詳細にアクセスし、それに対応した応答を返すことが可能になります。前セクションで説明したように、Muse のサンプル・プロジェクトの 1 つであるwsn-consumer サンプルを修正することで、このコードのテストを迅速に行うことができます。このサンプルは非常に軽量で、既存のメッセージ・リスナーをリスト 7 のメッセージ・リスナーに容易に置き換えることができます。

結論

この記事では、Apache Muse フレームワークを使用した WEF 操作のあらゆる側面について説明しました。イベントは、Muse ベースのアプリケーションの内側にも外側にも作成でき、イベントへの応答は、小型のコンシューマー・アプリケーションからでも、大型のメッセージ・ブローカーからでも可能です。WEF は、オリジナルのアプリケーションがどんなに複雑なものでも、3 つの小容量な JAR ファイルを追加して、標準フォーマットに変換したいシステムのイベントを定義することで、WEF のサポートを追加することが可能です。



参考文献

学ぶために
  • WSDM MUWS の Parts 1 および 2 に記載されている WEF 仕様をお読みください。

  • 以下の記事は、このチュートリアルに役立ちます。
    • JavaDoc for the WEF API
    • WEF factory」では、「空の」 WEF イベントとそのサブコンポーネント、および XML フラグメントにあるイベントとそのサブコンポーネントのインスタンス化に必要なメソッドを定義しています。
    • WSN NotificationConsumer」機能は、WS-N Notify の操作を公開し、その他のサーバー・サイド・コンポーネントに単純なメッセージ・リスナー API を提供します。

  • Apache Muse Web サイトでは、プロジェクトがサポートするすべての OASIS 標準をご覧になれます。

  • 以下のチュートリアルでは、Muse および WSDM についての詳細を学ぶことができます。
  • developerWorks Autonomic computing ゾーンには、記事、チュートリアル、標準と仕様に加えて、Build to Manage Toolkit for Problem Determination などのダウンロード可能なツールへのリンクが用意されています。

  • developerWorks SOA and Web services ゾーンでは、WS 標準およびそれがテクノロジーに与える影響について、詳細なリソースを提供しています。

  • developerWorks Java ゾーンでは、Java API に関する詳細なリソースを提供しています。

  • developerWorks XML ゾーンでは、XML の基礎を徹底的に学ぶことができます。


製品や技術を入手するために
  • Apache Muse 2.1.0 をダウンロードして入手してください。この記事で説明したコードを作成してテストするのにも使用できます。


議論するために


著者について

Photo of Dan Jemiolo

Dan Jemiolo は、ノースカロライナ州リサーチ・トライアングル・パークにある IBM Autonomic Computing チームの Advisory Software Engineer です。彼は Apache Muse 2.0 の設計および開発を指揮し、現在も引き続きこのプロジェクトに取り組んでいます。また、Dan は WS-RF TC に WS-ResourceMetadata 仕様のエディターとして参加しており、Web サービス標準の採用を促進する IBM の戦略に携わっています。彼はわずか 2 年前に、Rensselaer Polytechnic Institute で Computer Science を専攻し理学修士の学位を取得した後、IBM に入社しました




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



はいいいえわからない
 


 


12345
不充分・不完全である大変素晴らしい
 


この記事を共有する

はてなブックマーク はてなブックマーク livedoorクリップ livedoorクリップ del.icio.us del.icio.us Buzzurl(バザール) Buzzurl(バザール) Choix! Choix!
Saafブックマーク Saafブックマーク FC2ブックマーク FC2ブックマーク MM/memo MM/memo ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
CZブックマーク CZブックマーク newsing newsing




上に戻る


    日本IBMについて プライバシー お問い合わせ