ORACLE JAPAN Server Release 6.1

 

  |  

  WebLogic Server ホーム   |     アプリケーションの開発   |   前へ   |   次へ   |   目次   |   索引   |   PDF 版

プログラミング トピック

 

以下の節では、WebLogic Server 環境でのプログラミングに関する情報を提供し、WebLogic Server の便利な機能とさまざまなプログラミング手法の使い方について説明します。

 


ログ メッセージ

各 WebLogic Server インスタンスには、サーバが生成するメッセージを格納するログ ファイルがあります。アプリケーションは、ローカライズされたメッセージ カタログにアクセスするインターナショナライゼーション サービスを使用して、ログ ファイルにメッセージを書き込むことができます。ローカライゼーションが不要な場合は、weblogic.logging.NonCatalogLogger クラスを使用して、メッセージをログに書き込みます。このクラスは、クライアント アプリケーションがクライアント側のログ ファイルにメッセージを書き込むためにも使用されます。

ここでは、NonCatalogLogger クラスの使い方について説明します。インターナショナライゼーション インタフェースの使い方の詳細については、『BEA WebLogic Server インターナショナライゼーション ガイド』を参照してください。

ログ ファイルの名前、場所、およびその他のプロパティは、Administration Console で管理できます。NonCatalogLogger クラスを使って書き込まれるログ メッセージの内容は次のとおりです。

表4-1 ログ メッセージのフォーマット

プロパティ

説明

Localized Timestamp

メッセージが生成された日付と時刻。年、月、日、時、分、および秒が記載される。

millisecondsFromEpoch

メッセージの生成時刻のミリ秒部分。

ServerName、MachineName、ThreadId、TransactionId

メッセージの生成元。TransactionId は、トランザクションのコンテキストでロギングされたメッセージにのみ示される。

User Id

エラーが報告されたときに実行されていたシステムのユーザ。

Subsystem

EJB、JMS、または RMI のようなメッセージのソース。ユーザ アプリケーションは、NonCatalogLogger コンストラクタにサブシステム String を提供する。

Message Id

メッセージ固有の 6 桁の識別子。499000 までのすべてのメッセージ ID は WebLogic Server 用に予約されている。

Severity

重要度を示す次の値のいずれか。

Debug

サーバ/アプリケーションがデバッグ モードでコンフィグレーションされた場合にのみ出力される。サーバ/アプリケーションの処理または状態の詳細が示される場合がある。

Informational

後で調べる場合に備えて正常の処理をログに記録するために使用される。

Warning

サーバ/アプリケーションの正常の処理に影響しない要注意の処理、イベント、またはコンフィグレーション。

Error

ユーザ レベルのエラー。システム/アプリケーションは、割り込みやサービスの停止をせずにエラーに対処できる。

上記以外にも、WebLogic Server メッセージ用として次の重要度レベルが予約されている。

Notice

警告メッセージ。サーバの正常な処理に影響しない要注意の処理またはコンフィグレーション。

Critical

システム/サービス レベルのエラー。システムは回復できるが、サービスが瞬間的に停止したり、低下したりする可能性がある。

Alert

特定のサービスが使用不能な状態であることを示す。システムのその他の部分は機能し続ける。自動回復できないので、管理者が直ちに問題を解決する必要がある。

Emergency

サーバが使用不能な状態であることを示す。重大なシステム障害または危機的状態を示すために使用される。

ExceptionName

メッセージに例外がロギングされた場合、このフィールドには例外の名前が示される。

Message Text

WebLogic Server のメッセージの場合、このフィールドには、システム メッセージ カタログに定義されているメッセージの「短い説明」が示される。

NonCatalogLogger を使用するには、weblogic.logging.NonCatalogLogger クラスをインポートし、サブシステム String でコンストラクタを呼び出します。「MyApp」というサブシステム名を使って例を示します。

import weblogic.logging.NonCatalogLogger;
...
NonCatalogLogger mylogger = new NonCatalogLogger("MyApp");

NonCatalogLogger は、debug()info()warn()、および error() メソッドを提供し、それぞれのメソッドによって、Debug、Informational、Warning、および Error という重要度の付いたメッセージが書き込まれます。各メソッドには 2 つの署名があり、一方は String メッセージ引数を、他方は String メッセージ引数とjava.lang.Throwable 引数を取ります。2 番目の形式を使用する場合、ログ メッセージにはスタック トレースが含まれます。

ログに書き込まれた、スタック トレースのない通知メッセージを示します。

mylogger.info("MyApp initialized.");

Java クライアントで NonCatalogLogger を使用している場合は、weblogic.log.FileName Java システム プロパティを用いて、java コマンド ラインでログ ファイルの名前を指定します。次に例を示します。

java -Dweblogic.log.FileName=myapp.log myapp

ログ メッセージに特別な処理が必要な場合は、独自のメッセージ ハンドラを追加します。メッセージ ハンドラを使用すると、処理対象のメッセージをフィルタによって選択できます。WebLogic Server ロギング インフラストラクチャはログ メッセージごとに JMX 通知を生成します。この通知は、フィルタによってメッセージに対応する登録済みメッセージ ハンドラに送られます。

JMX 機能の使い方の詳細については、weblogic.management.logging.WebLogicLogNotification を参照してください。

 


WebLogic Server でのスレッドの使い方

WebLogic Server は高度なマルチスレッド アプリケーション サーバであり、ホストとなっているコンポーネントのリソースの割り当て、同時実行性、およびスレッドの同期化を慎重に管理します。WebLogic Server のアーキテクチャを最大限に活用するには、標準 J2EE API を使用して作成したコンポーネントで、アプリケーションを構築する必要があります。

サーバサイド コンポーネントで新しいスレッドの作成を必要とするアプリケーションの設計は、次の理由から避けることをお勧めします。

このような警告にもかかわらず、スレッドの作成が適切な状況もあります。たとえば、複数のリポジトリを検索して、結合された結果セットを返すアプリケーションの場合、メイン クライアント スレッドを同期的に使用する代わりに、各リポジトリの新しいスレッドを非同期的に使用して検索を実行すると、より速く結果が返されることがあります。

アプリケーション コードでのスレッドの使用を決定したら、アプリケーションが作成するスレッドの数を制御できるように、スレッド プールを作成する必要があります。JDBC 接続プールのように、指定した数のスレッドをプールに割り当て、実行可能なクラスのプールから利用できるスレッドを取得します。プール内のすべてのスレッドが使用中の場合は、スレッドが戻されるまで待機します。スレッド プールを使用すると、パフォーマンスの問題を回避し、WebLogic Server の実行スレッドとアプリケーションの間のスレッドの割り当てを最適化できます。

スレッドでデッドロックが発生しそうな場所を把握しておき、デッドロックが発生したら確実に処理します。設計を慎重に見直して、スレッドがセキュリティ システムを危険にさらすことのないようにしておきます。

WebLogic Server スレッドとの望ましくない対話を避けるには、WebLogic Server コンポーネントの中でスレッドの呼び出しを使用しないようにします。たとえば、作成するスレッドからは、エンタープライズ Bean やサーブレットを使用しないでください。アプリケーション スレッドは、TCP/IP 接続による外部サービス、またはファイルの適切なロックや読み書きを行う外部サービスとの対話のような、独立していて分離されたタスクに使用するのが最適です。存続期間が短く、1 つの目的を実行して終了する(スレッドをプールに返す)スレッドの方が、他のスレッドと競合しません。

障害のポイントにクライアントを追加して、負荷が次第に大きくなるような状況でマルチスレッドのコードをテストします。アプリケーションのパフォーマンスと WebLogic Server の動作を監視し、プロダクション環境で障害が発生しないことを確認しておきます。

 


WebLogic Server アプリケーションでの JavaMail の使い方

WebLogic Server には、Sun Microsystems の JavaMail API バージョン 1.1.3 参照実装が含まれています。JavaMail API を使用すると、WebLogic Server アプリケーションに E メール機能を追加できます。JavaMail を使用すると、自社ネットワークまたはインターネット上の IMAP 対応および SMTP 対応サーバに Java アプリケーションからアクセスできます。JavaMail はメール サーバ機能を持っていないので、JavaMail を使用するにはメール サーバが必要です。

JavaMail API の使い方について詳細に説明したドキュメントは、Sun の Web サイトにある JavaMail のページで入手できます。ここでは、WebLogic Server 環境で JavaMail を使用する方法について説明しています。

weblogic.jar ファイルには、Sun の javax.mail および javax.mail.internet パッケージが含まれています。weblogic.jar には、JavaMail で必要な Java Activation Framework(JAF)パッケージも含まれています。

javax.mail パッケージには、Internet Message Access Protocol(IMAP)および Simple Mail Transfer Protocol(SMTP)メール サーバのプロバイダが含まれています。Sun には、JavaMail 用に独自の POP3 プロバイダがあります。これは、weblogic.jar には含まれていません。使用する場合は、Sun からその POP3 プロバイダをダウンロードし、WebLogic Server のクラスパスに追加できます。

JavaMail コンフィグレーション ファイル

JavaMail は、システムのメール転送機能を定義するコンフィグレーション ファイルに依存します。weblogic.jar ファイルには、Sun の標準コンフィグレーション ファイルが入っています。このファイルにより、IMAP および SMTP メール サーバが JavaMail 向けに使用可能になり、JavaMail が処理できるデフォルトのメッセージ タイプが定義されます。

JavaMail を拡張してサポートする転送、プロトコル、およびメッセージのタイプを追加する場合を除いて、JavaMail コンフィグレーション ファイルを変更する必要はありません。JavaMail を拡張する場合は、Sun の Web サイトから JavaMail をダウンロードして、拡張を追加するための Sun による手順に従います。次に、拡張した JavaMail パッケージを weblogic.jar. の前の WebLogic Server クラスパスに追加します。

WebLogic Server 用の JavaMail のコンフィグレーション

WebLogic Server で使用するために JavaMail をコンフィグレーションするには、WebLogic Server Administration Console でメール セッションを作成します。これにより、あらかじめコンフィグレーションしておくセッション プロパティを使用して、サーバサイド コンポーネントとアプリケーションで JNDI を用いて JavaMail サービスにアクセスできるようになります。たとえば、メール セッションを作成すると、メール ホスト、転送および格納プロトコル、デフォルトのメール ユーザを Administration Console で指定できるため、JavaMail を使用するコンポーネントでこれらのプロパティを設定する必要はありません。WebLogic Server は単一のセッション オブジェクトを作成し、JNDI を通じてそのオブジェクトを必要とするすべてのコンポーネントで利用できるようにするため、多数の電子メール ユーザを持つアプリケーションではメリットが得られます。

  1. Administration Console で、左ペインの [メール] ノードをクリックします。

  2. [新しい Mail Session のコンフィグレーション] をクリックします。

  3. 右ペインのフォームに次のように入力します。

表4-2 メール セッションのプロパティ フィールド

プロパティ

説明

デフォルト値

mail.store.protocol

E メールを取り出すために使用するプロトコル。

例 :

mail.store.protocol=imap

付属の JavaMail ライブラリは IMAP をサポートしている。

mail.transport.protocol

E メールを送信するために使用するプロトコル。

例 :

mail.transport.protocol=smtp

付属の JavaMail ライブラリは SMTP をサポートしている。

mail.host

メール ホスト マシンの名前。

例 :

mail.host=mailserver

デフォルトではローカル マシン。

mail.user

E メールを取り出すデフォルト ユーザの名前。

例 :

mail.user=postmaster

デフォルトは、user.name Java システム プロパティの値。

mail.protocol.host


特定のプロトコルに対応するメール ホスト。たとえば、mail.SMTP.host と mail.IMAP.host を別々のマシン名に設定できる。

例 :

mail.smtp.host=mail.mydom.com
mail.imap.host=localhost

mail.host プロパティの値。

mail.protocol.user

メール サーバにロギングするプロトコル固有のデフォルト ユーザ名。

例 :

mail.smtp.user=weblogic
mail.imap.user=appuser

mail.user プロパティの値。

mail.from

デフォルトの返信アドレス。

例 :

mail.from=master@mydom.com

username@host

mail.debug

JavaMail デバッグ出力を有効にするには True に設定する。

False

メール セッションで設定したプロパティ セットは、オーバーライドするプロパティを含む Properties オブジェクトを作成すると、コード内でオーバーライドできます。
メール セッション オブジェクトを JNDI でルックアップした後、Properties を使用して Session.getInstance() メソッドを呼び出し、カスタマイズしたセッションを取得します。

JavaMail を使用したメッセージの送信

WebLogic Server コンポーネント内から JavaMail を使用してメッセージを送信する手順は次のとおりです。

  1. JNDI (naming)、JavaBean Activation、JavaMail パッケージをインポートします。java.util.Properties: もインポートします。

    import java.util.*;
    import javax.activation.*;
    import javax.mail.*;
    import javax.mail.internet.*;
    import javax.naming.*;

  2. JNDI でメール セッションを次のようにルックアップします。

    InitialContext ic = new InitialContext();
    Session session = (Session) ic.lookup("myMailSession");

  3. Administration Console で設定したセッションのプロパティをオーバーライドする必要がある場合は、Properties オブジェクトを作成してオーバーライドするプロパティに追加します。getInstance() を呼び出して、新しいプロパティの新しいセッション オブジェクトを取得します。

    Properties props = new Properties();
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.host", "mailhost");
    // HTML フォームからのメール アドレスを発信元アドレスに使用する
    props.put("mail.from", emailAddress);
    Session session2 = session.getInstance(props);

  4. MimeMessage を作成します。次の例で、tosubject、および messageTxt は文字列の変数で、ユーザが入力した内容が入ります。

    Message msg = new MimeMessage(session2);
    msg.setFrom();
    msg.setRecipients(Message.RecipientType.TO,
    InternetAddress.parse(to, false));
    msg.setSubject(subject);
    msg.setSentDate(new Date());
    // コンテンツは、本文が 1 つある MIME マルチパート メッセージに
    // 格納される
    MimeBodyPart mbp = new MimeBodyPart();
    mbp.setText(messageTxt);

    Multipart mp = new MimeMultipart();
    mp.addBodyPart(mbp);
    msg.setContent(mp);

  5. メッセージを送信します。

    Transport.send(msg);

JNDI ルックアップでは、エラーが発生すると NamingException 例外が送出されます。JavaMail では、転送クラスの特定またはメール ホストとの通信に失敗した場合に MessagingException が送出されます。コードを try ブロックの中に配置し、これらの例外を補足して処理するようにしておきます。

JavaMail を使用したメッセージの読み込み

JavaMail API を使用すると、メッセージ ストアに接続できます。メッセージ ストアは IMAP サーバまたは POP3 サーバとなります。メッセージはフォルダに保存されます。IMAP の場合、メッセージ フォルダはメール サーバ上に格納されます。メッセージ フォルダには、受信したメッセージが入るフォルダとアーカイブされたメッセージが入るフォルダがあります。POP3 の場合は、メッセージの到着時にメッセージを保存するフォルダをサーバが提供します。クライアントは、POP3 サーバに接続するときに、メッセージを取得してクライアントのメッセージ ストアに転送します。

フォルダは、ディスクのディレクトリと同じような階層構造になっています。フォルダにはメッセージまたは他のフォルダを格納できます。デフォルトのフォルダは構造の最上位にあります。特別なフォルダ名である INBOX は、ユーザのプライマリ フォルダのことを指し、デフォルト フォルダの内部にあります。受信したメールを読み込むには、ストアからデフォルト フォルダを取得して、次にデフォルト フォルダから INBOX フォルダを取得します。

API では、指定した数または範囲のメッセージを読み取る、またはメッセージの特定の部分をあらかじめ取り出してフォルダのキャッシュに入れるなど、メッセージの読み込みについて複数のオプションを提供しています。詳細については、JavaMail API を参照してください。

WebLogic Server コンポーネント内から POP3 サーバで受信したメッセージを読み込む手順は次のとおりです。

  1. JNDI(naming)、JavaBean Activation、JavaMail パッケージをインポートします。java.util.Properties: もインポートします。

    import java.util.*;
    import javax.activation.*;
    import javax.mail.*;
    import javax.mail.internet.*;
    import javax.naming.*;

  2. JNDI でメール セッションを次のようにルックアップします。

    InitialContext ic = new InitialContext();
    Session session = (Session) ic.lookup("myMailSession");

  3. Administration Console で設定したセッションのプロパティをオーバーライドする必要がある場合は、Properties オブジェクトを作成してオーバーライドするプロパティに追加します。getInstance() を呼び出して、新しいプロパティの新しいセッション オブジェクトを取得します。

    Properties props = new Properties();
    props.put("mail.store.protocol", "pop3");
    props.put("mail.pop3.host", "mailhost");
    Session session2 = session.getInstance(props);

  4. セッションから Store オブジェクトを取得し、connect() メソッドを呼び出してメール サーバに接続します。接続の認証を行うには、接続メソッドでメールホスト、ユーザ名、およびパスワードを提供する必要があります。

    Store store = session.getStore();
    store.connect(mailhost, username, password);

  5. デフォルト フォルダを取得し、そのフォルダを使用して INBOX フォルダを取得します。

    Folder folder = store.getDefaultFolder();
    folder = folder.getFolder("INBOX");

  6. フォルダ内のメッセージを、メッセージの配列に読み込みます。

    Message[] messages = folder.getMessages();

  7. メッセージの配列にあるメッセージを処理します。メッセージ クラスには、ヘッダ、フラグ、メッセージの内容など、メッセージのさまざまな部分にアクセスできるメソッドがあります。

IMAP サーバからのメッセージの読み込みは、POP3 サーバからのメッセージの読み込みと同様です。ただし IMAP の場合は、フォルダを作成および操作し、フォルダ間でメッセージを転送するメソッドが JavaMail API で提供されています。IMAP サーバを使用すると、POP3 サーバを使用する場合よりも少ないコードで、多機能な Web ベースのメール クライアントを実装できます。POP3 では、おそらくデータベースまたはフォルダを表すためのファイル システムを使用して、WebLogic Server からメッセージ ストアを管理するコードを記述する必要があります。

 


WebLogic Server クラスタのアプリケーションのプログラミング

WebLogic Server のクラスタにデプロイされる JSP およびサーブレットは、セッション データを保持するために一部の要件を確認する必要があります。詳細については、『WebLogic Server クラスタ ユーザーズ ガイド』の「セッション プログラミングの必要条件」を参照してください。

WebLogic Server クラスタでデプロイされる EJB には、EJB のタイプに基づく制約があります。クラスタのさまざまな EJB タイプでの機能に関する詳細については、「WebLogic Server EJB コンテナ」を参照してください。EJB は、EJB デプロイメント記述子でプロパティを設定することでクラスタにデプロイできます。weblogic-ejb-jar.xml デプロイメント記述子は、クラスタ化に対応する XML デプロイメント要素を示します。

クラスタでデプロイするために EJB またはカスタム RMI オブジェクトのどちらかを開発する場合、クラスタ化されたオブジェクトの JNDI ツリーでのバインドについて理解するために、「クラスタ環境での WebLogic JNDI の使い方」も参照してください。

 

back to top previous page next page