![]() |
![]() |
|
|
| |
プログラミング トピック
以下の節では、WebLogic Server 環境でのプログラミングに関する情報を提供し、WebLogic Server の便利な機能とさまざまなプログラミング手法の使い方について説明します。
各 WebLogic Server インスタンスには、サーバが生成するメッセージを格納するログ ファイルがあります。アプリケーションは、ローカライズされたメッセージ カタログにアクセスするインターナショナライゼーション サービスを使用して、ログ ファイルにメッセージを書き込むことができます。ローカライゼーションが不要な場合は、weblogic.logging.NonCatalogLogger クラスを使用して、メッセージをログに書き込みます。このクラスは、クライアント アプリケーションがクライアント側のログ ファイルにメッセージを書き込むためにも使用されます。
ここでは、NonCatalogLogger
クラスの使い方について説明します。インターナショナライゼーション インタフェースの使い方の詳細については、『BEA WebLogic Server インターナショナライゼーション ガイド』を参照してください。
ログ ファイルの名前、場所、およびその他のプロパティは、Administration Console で管理できます。NonCatalogLogger
クラスを使って書き込まれるログ メッセージの内容は次のとおりです。
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 のアーキテクチャを最大限に活用するには、標準 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 は、システムのメール転送機能を定義するコンフィグレーション ファイルに依存します。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 を通じてそのオブジェクトを必要とするすべてのコンポーネントで利用できるようにするため、多数の電子メール ユーザを持つアプリケーションではメリットが得られます。
javax.mail.Session
オブジェクトをルック アップします。
メール セッションで設定したプロパティ セットは、オーバーライドするプロパティを含む Properties
オブジェクトを作成すると、コード内でオーバーライドできます。
メール セッション オブジェクトを JNDI でルックアップした後、Properties
を使用して Session.getInstance()
メソッドを呼び出し、カスタマイズしたセッションを取得します。
WebLogic Server コンポーネント内から JavaMail を使用してメッセージを送信する手順は次のとおりです。
java.util.Properties:
もインポートします。
import java.util.*;
import javax.activation.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.naming.*;
InitialContext ic = new InitialContext();
Session session = (Session) ic.lookup("myMailSession");
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);
MimeMessage
を作成します。次の例で、to
、subject
、および 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);
Transport.send(msg);
JNDI ルックアップでは、エラーが発生すると NamingException
例外が送出されます。JavaMail では、転送クラスの特定またはメール ホストとの通信に失敗した場合に MessagingException
が送出されます。コードを try ブロックの中に配置し、これらの例外を補足して処理するようにしておきます。
JavaMail API を使用すると、メッセージ ストアに接続できます。メッセージ ストアは IMAP サーバまたは POP3 サーバとなります。メッセージはフォルダに保存されます。IMAP の場合、メッセージ フォルダはメール サーバ上に格納されます。メッセージ フォルダには、受信したメッセージが入るフォルダとアーカイブされたメッセージが入るフォルダがあります。POP3 の場合は、メッセージの到着時にメッセージを保存するフォルダをサーバが提供します。クライアントは、POP3 サーバに接続するときに、メッセージを取得してクライアントのメッセージ ストアに転送します。
フォルダは、ディスクのディレクトリと同じような階層構造になっています。フォルダにはメッセージまたは他のフォルダを格納できます。デフォルトのフォルダは構造の最上位にあります。特別なフォルダ名である INBOX は、ユーザのプライマリ フォルダのことを指し、デフォルト フォルダの内部にあります。受信したメールを読み込むには、ストアからデフォルト フォルダを取得して、次にデフォルト フォルダから INBOX フォルダを取得します。
API では、指定した数または範囲のメッセージを読み取る、またはメッセージの特定の部分をあらかじめ取り出してフォルダのキャッシュに入れるなど、メッセージの読み込みについて複数のオプションを提供しています。詳細については、JavaMail API を参照してください。
WebLogic Server コンポーネント内から POP3 サーバで受信したメッセージを読み込む手順は次のとおりです。
java.util.Properties:
もインポートします。
import java.util.*;
import javax.activation.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.naming.*;
InitialContext ic = new InitialContext();
Session session = (Session) ic.lookup("myMailSession");
Properties
オブジェクトを作成してオーバーライドするプロパティに追加します。getInstance()
を呼び出して、新しいプロパティの新しいセッション オブジェクトを取得します。
Properties props = new Properties();
props.put("mail.store.protocol", "pop3");
props.put("mail.pop3.host", "mailhost");
Session session2 = session.getInstance(props);
Store
オブジェクトを取得し、connect()
メソッドを呼び出してメール サーバに接続します。接続の認証を行うには、接続メソッドでメールホスト、ユーザ名、およびパスワードを提供する必要があります。
Store store = session.getStore();
store.connect(mailhost
,username
,password
);
Folder folder = store.getDefaultFolder();
folder = folder.getFolder("INBOX");
Message[] messages = folder.getMessages();
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 の使い方」も参照してください。
![]() |
![]() |
![]() |