レベル: 初級 Willy Farrell, e-business Architect, IBM, Software Group
2002年 12月 01日 2回連載の最後にあたるこの記事では、Java Message Service (JMS) 処理とデータベース・アクセスを、WebSphere Application Server内の同一トランザクション作業単位として実行する方法について説明します。ここでは、サンプル・コードとそれに関する説明を示し、コードのデプロイとアプリケーション・サーバーおよびデータベースの構成のための手順を段階を追って紹介します。この記事で使用されているソフトウェアはすべてダウンロードできます。
はじめに
WebSphere MQとWebSphere Studio Application Developer (Application Developer) を用いたJMSプログラミングに関する以前の記事で、取り上げなかったトピックについて多数の質問を受け取りました。今回は、それらについて説明します。上記の記事へのリンクについては、参考文献を参照してください。この記事の第1回では、WebSphere Application Server (Application Server) Version 4.xでEnterprise JavaBeans (EJB) アプリケーションに非同期メッセージング・サポートを提供する方法について説明しました。そこでは、Application Serverで実装されているJava 2 Enterprise Edition (J2EE) Version 1.2ではサポートされていないメッセージ・ドリブンBean (MDB) を、Application Serverでシミュレートする方法を示しました。
今回の記事では、JMSメッセージ処理とデータベース・アクセスを、同一トランザクションの一部として実行する方法を説明します。この記事の説明は、第1回の記事で作成およびテストされた構成の上に成り立っているため、その回の説明を理解し、実行したことが前提になっています。
サンプル・コードおよび構成の説明に入る前に、トランザクションの概要、それらの動作、それらをJ2EE対応アプリケーション・サーバーで提供する方法を以下に示します。
トランザクション
アプリケーションは、トランザクションという仕掛けを使用して、(関係データベースやエンタープライズ・メッセージング・システムなどの)リソース・マネージャーを使用してなされた分割不能プロセス (atomic process) を、単一の作業単位として扱われるようにします。たとえば、ある口座から別の口座に資金を振り込むプログラムでは、トランザクションを使用することで、引き落としする口座と振り込み先の口座の両方を正しく更新することができます。すべてが筋書きどおりに実行されると、トランザクションがコミットされ、両方の口座が更新されます。つまり、引き落としする口座の残高は減少し、振り込み先口座の残高は増加します。アプリケーションでどちらかの口座を更新しようとしたときにエラーが発生すると、トランザクションがロールバックされ、両方の口座残高がトランザクション実行前の金額に戻ります。
多くの場合、1つの作業単位は、単一のリソース・マネージャーを使用して実行され、そのリソース・マネージャーはアプリケーションが要求するトランザクションの機能を提供します。ただし、複数のリソース・マネージャーの動作を調整することが必要になる場合もあり、その場合は、関連するすべてのリソース・マネージャーによって実行される作業が、同一トランザクションの一部として処理されます。この調整を実行するプロセスをトランザクション・マネージャーと呼びます。さらに、リソース・マネージャー自身が調整可能であることも必要です。そのようなリソース・マネージャーをXAリソース・マネージャーと呼びます。XAは、Open Groupによって制定された分散トランザクション処理の標準です。Open Groupは相互運用性と統合の標準化を目的としたソフトウェア・ベンダーのコンソーシアムです。
J2EEの仕様では、XA標準に対応したアプリケーション・サーバーで、分散トランザクション・サポートを提供するためのJava Transaction API (JTA) が定義されています。この仕様には、トランザクションの処理を実行する、トランザクション・マネージャー、リソース・マネージャー、アプリケーションの間のインターフェースが規定されています。J2EEは、JTAを実装するトランザクション・マネージャーのためのJava Transaction Service (JTS) 仕様も提供しています。J2EE対応アプリケーション・サーバーはすべてJTSの実装を提供します。
EJBトランザクション
J2EE環境では、通常、EJBコンポーネントによって実行される処理の内部で、トランザクションが実行されます。EJB仕様によって、開発者は、ディプロイメント・ディスクリプターでEJBコンポーネントに必要なトランザクションのサポートを宣言できます。各開発者が、トランザクションの開始、コミット、またはロールバックをプログラミングする必要はありません。EJBコンテナーは、ディプロイメント・ディスクリプターの情報を使用して、必要に応じてトランザクションの要求、トランザクションの開始およびコミット、またはロールバックを処理します。
通常、EJBトランザクションは関係データベースのみを処理するため、JTA対応のリソース・マネージャー (XAリソース・マネージャー) は不要です。JTAトランザクションが必要な場合は、その要求をサポートするようにデータベースおよびデータベース・ドライバーを構成する必要があります。この場合でも、トランザクションはEJBコンテナーによって処理されるため、アプリケーション・コードを変更する必要はありません。
JMSトランザクション
プログラムで実行するJMSトランザクション機能は、Session インターフェースを介して提供されます。Session を作成するときに、トランザクションを扱うかどうかを宣言します。トランザクションを扱うと定義しておくと、アプリケーション・プログラムは、トランザクションをコミットおよびロールバックするメソッドをSession 上で呼び出します。Session にはトランザクション処理を開始するメソッドはありません。Session でトランザクションを扱う場合、すべてのメッセージは1つのトランザクションの一部として送受信されます。トランザクションはコミットまたはロールバックによって終了し、別のトランザクションが自動的に始まります。
JMSには、JTAトランザクションをサポートする専用インターフェース群も用意されています。これらのインターフェース群は、アプリケーション・サーバーによって使用されることを意図しているため、実際に使用されていてもJMSクライアントからは認識されません。トランザクションがアプリケーション・サーバーによって処理される場合、アプリケーション・コードはトランザクション処理にSession メソッドを使用しません。
サンプル・コードと構成ファイルのインストール
サンプル・コードは、JMSメッセージ処理を関係データベース・アクセスと組み合わせて用いている簡単なJ2EEエンタープライズ・アプリケーションです。このコードは、JavaBeansコンポーネントを介してセッションBeanにテキスト文字列を受け渡すWebアプリケーションで構成されています。このテキストは、JMS
Queue に処理を任せるメッセージの作成に使用します。そのメッセージIDとテキストは、エンティティーBeanを使用して関係データベースに格納されます。
ここでサンプル・コードと構成ファイルをダウンロードし、インストールしてください。この記事の後半でこれらのファイルを使用するときに、そのファイルと内容について詳しく説明します。
まず、コードをダウンロードして、構成ファイルを適切なWebSphere MQフォルダーにコピーします。
- サンプル・コードと構成ファイルをダウンロードする (上記のリンクを参照)。このファイルの名前はi-mqejb2.zipです。
- zipファイルをシステムのC:\ フォルダーに解凍する。解凍時にフォルダー名を変更しないでください。あなたのシステム内にC:\MQEJB2フォルダーが作成され、その中にサンプル・コードと構成ファイルが格納されます。
- C:\MQEJB2\setenv.batをC:\WSMQ\Java\binにコピーする。既存のsetenv.batファイルを上書きします。
- C:\MQEJB2\setup.ejbをC:\WSMQ\Java\binにコピーする。
次にサンプル・コードをApplication Developerにインポートします。
-
Start メニューからApplication Developerを起動する。これ以降は、Application Developerが実行されているものとして手順を説明します。
- メニューからFile>Import... を選択する。
-
EAR file を選択し、Next をクリックする。
-
EAR.File フィールドに
C:\MQEJB2\transmq.ear とタイプする。
-
Enterprise application project name: フィールドに
TransMQEAR とタイプする。Next をクリックします。
-
Module files in EAR: リストボックスでTransMQWeb.warを選択する。
-
Available dependent JARs: リストボックスでTransMQEJBs.jarにチェックを入れる。
-
Finish をクリックする。
MessageHandlerセッションBean
サンプル・アプリケーションの処理の大部分はMessageHandler セッションBeanで実行されます。以下に示すejbCreate() メソッドでは、ローカル環境を使用してJMS処理に必要なJMS管理オブジェクトがルックアップされます。次に、MessageData エンティティーBeanにアクセスするためにMessageDataFactory インスタンスが作成されます。
ejbCreate() メソッド
public void ejbCreate() throws CreateException {
try {
Context context = new InitialContext();
Context environment = (Context) context.lookup("java:comp/env");
factory =
(QueueConnectionFactory) environment.lookup(QUEUE_CONNECTION_FACTORY);
queue = (Queue) environment.lookup(QUEUE);
messageDataFactory = new MessageDataFactory();
} catch (NamingException ne) {
throw new CreateException(ne.getMessage());
}
} |
以下に示すように、実際の処理はhandleMessage() メソッドで行われます。まず、text パラメーターを使用してメッセージが作成され、そのメッセージがQueue に送信されます。次にMessageDataFactory を使用してMessageData エンティティーBeanが作成されます。
handleMessage() メソッド
public void handleMessage(String text) {
QueueConnection connection = null;
try {
connection = factory.createQueueConnection();
QueueSession session =
connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueSender sender = session.createSender(queue);
TextMessage message = session.createTextMessage(text);
sender.send(message);
if (text.equalsIgnoreCase("JMS exception")) {
throw new EJBException("Thrown to simulate JMS error");
}
messageDataFactory.create(message.getJMSMessageID(), text);
if (text.equalsIgnoreCase("DB exception")) {
throw new EJBException("Thrown to simulate DB error");
}
} catch (CreateException c) {
throw new EJBException(c);
} catch (RemoteException r) {
throw new EJBException(r);
} catch (JMSException j) {
throw new EJBException(j);
} finally {
if (connection != null) {
try {
connection.close();
} catch (JMSException j) {
throw new EJBException(j);
}
}
}
} |
上記のhandleMessage() のif 文に注意してください。このif文の条件がtrue の場合に例外がスローされます。このコードをデプロイした後は、これらの文を使用するとコードのトランザクション処理機能をテストできます。「JMS exception」というテキスト文字列を渡すことによって、JMSの処理中にエラーが発生したときのコードの動作をテストできます。同様に「DB exception」を渡すと、MessageData エンティティーBeanを介して関係データベースにアクセスしようとしてエラーが発生したときのコードの動作をテストすることもできます。
このコードには、トランザクション処理用のコードがないことに注意してください。つまり、begin、commit、rollback がありません。QueueSession を作成するコードであってもfalse を渡して、QueueSession がトランザクションとして処理されないことを示します。以下に示すように、トランザクション処理に必要なものはすべて構成の中で処理されます。
MessageBeanクラス
MessageBean クラスは、エンタープライズ・アプリケーションのWebモジュール内で、MessageHandler セッションBeanにアクセスするために使用されます。このクラスには、書き込み専用text プロパティーと読み取り専用results プロパティーが含まれています。Webモジュールでは、HTMLフォームを使用してtext プロパティーが設定され、execute() メソッドが呼び出されます。次に、JavaServer Pages (JSP) コンポーネントを使用してresults プロパティーが表示されます。
以下に示すexecute() メソッドは、コンストラクターでインスタンス化されたEJBファクトリーから単にMessageHandler セッションBeanを作成し、セッションBeanのhandleMessage() メソッドを呼び出します。このメソッドにパラメーターとしてtext プロパティーを渡し、エラーが発生しなければresults プロパティーに成功メッセージを設定します。エラーが発生した場合は、results にエラー・メッセージが設定されます。
execute() メソッド
public void execute() {
try {
MessageHandler ejb = ejbFactory.create();
ejb.handleMessage(text);
ejb.remove();
results = "Message successfully processed";
} catch (Exception e) {
e.printStackTrace();
results = "Error processing message";
}
} |
サンプル・コードを構成するその他のJavaコンポーネントは次のとおりです。
-
MessageData エンティティーBean
- コンテナー管理による永続性 (CMP) を使用してその属性を関係データベースに格納する、非常に単純なエンティティーBeanです。これらの属性は、JMSメッセージの
MessageID であるid と、そのメッセージのString 本文であるtext です。ほとんどすべてのMessageData エンティティーBeanは、Application DeveloperのCreate an Enterprise bean ウィザードを利用して作成されたものです。そのソース・コードは、きわめて簡単なものなのでここには掲載していません。
-
MessageController サーブレット
- Application DeveloperのCreate Web Pages from a Java bean ウィザードを使用して作成されたものです。このウィザードでは、テキストとJSPを渡して結果を表示するためのHTML入力フォームも作成されています。これらのコンポーネントのソース・コードはここには示しませんが、そのコードを見ると、その中で上記の
MessageBean の箇所で説明した処理が実行されていることがわかります。
EJBディプロイメント・ディスクリプター
上記に示したように、サンプル・アプリケーションのソース・コードにはトランザクション処理を実行する箇所がありません。それでは、実行する作業が1つのトランザクションの中で行われるようにするにはどうすればよいのでしょうか。それは、EJBディプロイメント・ディスクリプターで行います。このセクションでは、ディプロイメント・ディスクリプターに注目してどこでトランザクションの要求が設定されるかを調べ、アプリケーションの動作にとって重要なその他の設定を見ていきます。
- Application DeveloperでJ2EEパースペクティブに切り替え、J2EEビューでTransMQEJBsモジュールに移動する。
- TransMQEJBを右クリックし、Open With>EJB Editor を選択する。
- EJB EditorでTransaction タブをクリックする。
- MessageHandlerの横にある+ 記号をクリックする。
この項目は、このEJBコンポーネントのすべてのリモート・メソッドを1つのトランザクション内で実行する必要があることを示します。このメソッドを呼び出すクライアント・コードでトランザクションが開始されていない場合、メソッドが呼び出される前にコンテナーでトランザクションを開始する必要があります。メソッドが正常に完了すると、コンテナーでトランザクションがコミットされます。メソッドが例外をスローした場合は、コンテナーでトランザクションがロールバックされます。上記のソース・コードではトランザクション・プログラミングが実行されなかったことを思い出してください。サンプル・アプリケーションでトランザクションを開始するにはこのような方法を用います。
- MessageDataの横にある+ 記号をクリックする。
この項目は、このEJBコンポーネントのすべてのリモート・メソッドとホーム・メソッドを1つのトランザクション内で実行する必要があることを示します。MessageData コンポーネントには、MessageHandler セッションBeanのhandleMessage() メソッドでのみアクセスできるため、MessageData の呼び出しは、handleMessage() を呼び出す前にコンテナーで作成されるトランザクションと同一トランザクションに含まれることになります。
MessageHandler のejbCreate() メソッドでは、ローカル環境でQueueConnectionFactory 管理オブジェクトおよびQueue 管理オブジェクトに対するルックアップが実行されます。これらのオブジェクトへの参照は、ディプロイメント・ディスクリプターで設定されます。
- EJB EditorでReferences タブをクリックする。
-
Resource references ラジオ・ボタンをクリックする。
- MessageHandlerの横にある+ 記号をクリックする。
この項目は、リソース参照の名前と型を示します。それはejbCreate() で使用される名前と一致します。
ここで、これらの名前がJava Naming and Directory Interface (JNDI) 名前空間にバインドされたJMSオブジェクトにどのように結び付けられるのかと疑問に思うかもしれません。また、MessageData エンティティーBeanがその永続データへのアクセスに使用するデータソースをどのように認識するのかということも疑問点になるかもしれません。これらの項目はEJB Extension Editorで見ることができます。
- J2EEビューでTransMQEJBsを右クリックし、Open With>EJB Extension Editor を選択する。
- EJB Extension EditorでBindings タブをクリックする。
- TransMQEJBsの横にある+ 記号をクリックする。
- MessageHandlerの横にある+ 記号をクリックする。
EJB Editorで定義されているリソース参照が表示されます。各リソース参照をクリックすると、queueConnectionFactory がJNDI名jms/EJBQCF に、queue がJNDI名jms/EJBQueue にバインドされていることがわかります。これらのJMSオブジェクトは後述のステップで作成します。
-
MessageData をクリックする。
使用されるデータソースがjdbc/jmsdb という名前であることがわかります。このデータソースは後述のステップで作成します。
DB2のインストールと構成
サンプル・コードとEJBディプロイメント・ディスクリプターを理解したので、アプリケーションを実行する準備ができました。ただし、MessageData がその属性を保持できるデータベースを先にインストールして、JTAトランザクションに関与できるようにそのデータベースを構成しておく必要があります。IBM DB2 Universal Database (Personal Edition) Version 7.2をインストールして構成します。この製品をインストールするには次のように操作します。
- DB2 Universal Database (Personal Edition) Version 7.2 for Windowsの試用版 (trial version) を ダウンロードする (リンクについては参考文献を参照)。ファイルの名前は100_PE_WIN_SBCS.zipです。
- このzipファイルをシステムのフォルダーに解凍する。解凍時にフォルダー名を変更しないでください。
- zipファイルを解凍した後、セットアップ ファイルの解凍先フォルダーにあるsetup.exeを起動する。
- Select Productsダイアログで、DB2 Personal Edition にのみチェックを入れる。
- Select Installation TypeダイアログでTypical を選択する。
- Choose Destination Locationダイアログで、Destination folder を
C:\SQLLIB に変更する。
- Enter Username and Password for Control Center Serverダイアログで、Password フィールドとConfirm password フィールドに
password をタイプする。
- db2adminユーザー名を作成するか尋ねるプロンプトが表示されたら、Yes をクリックする。
- DB2のインストールが完了した後、開いているウィンドウをすべて閉じる。
ここで、JDBC Version 2を使用するようにDB2を構成する必要があります。
- Windowsのスタート ボタンから、設定 > コントロール パネル > 管理ツール > サービスを選択し、Windowsサービス アプレットを起動する。
- 以下のサービスを1つずつ選択して右クリックし、停止を選択してサービスを停止する。停止するサービスの名前は次のとおりです。
- DB2 - DB2
- DB2 - DB2DAS00
- DB2 JDBC Applet Server
- DB2 Remote Command
- DB2 Security Server
- この時点ではサービス・アプレットを閉じないでください。
- コマンド・プロンプトを開き、C:\SQLLIB\java12に移動する。
-
usejdbc2 とタイプしてEnter を押す。
-
exit とタイプしてEnter を押す。
- サービス・アプレットに戻り、上記の手順で停止したサービスを1つずつ選択して右クリックし、開始 を選択してサービスを開始する。
- 完了した後、サービス・アプレットを閉じる。
次に、サンプル・アプリケーションで使用するデータベースを作成します。
- Windowsスタートボタンから、プログラム >IBM DB2>Command Window を選択してDB2 Command Windowを起動する
- C:\MQEJB2に移動する。
-
db2 -tvf init.ddl とタイプしてEnter を押す。これによって、MessageData の属性を格納するjmsdbデータベースとmessagedataテーブルが作成されます。コマンドを初めて実行すると "The database directory cannot be found on the indicated file system" というメッセージが表示されます。これは無視して構いません。
- コマンドが完了するまで待ちます。コマンドが完了してもウィンドウは閉じないでください。
DB2構成の最後のステップは、このデータベースがJTAトランザクションに関与できるようにすることです。
- Windowsのスタートボタンからプログラム >IBM DB2>Control Center を選択し、DB2 Control Centerを起動する。
- システム・ツリーでDB2 インスタンスに移動する。
-
DB2 を右クリックし、Multisite Update>Configure... を選択する。
-
Use the TP monitor named below ラジオ・ボタンを選択する。
-
TP monitor ドロップダウンで、JTS を選択する。
-
Finish をクリックする。
- 表示されているDB2 Messageウィンドウを閉じる。ただし、Control Centerは終了しないでください。
- 前に開いたDB2 Command Windowに戻り、
db2 -tvf jtainit.ddl とタイプしてEnter を押す。これによって、必要なクラスとデータベースがバインドされます。独立性レベルのエスカレートに関するメッセージは無視して構いません。
-
exit とタイプしてEnter を押す。
JMS管理オブジェクトの作成
データベースをインストールして構成してあれば、JMS管理オブジェクトを作成してJNDI名前空間にバインドできます。そのために使用するファイルを確認してみます。まず、以下のsetenv.batから始めます。
setenv.bat
@echo off
set WAS_HOME=c:\WSAD\plugins\com.ibm.etools.websphere.runtime
set MQ_JAVA_INSTALL_PATH=c:\wsmq\java
@rem Java runtime
set JAVA_HOME=C:\WSAD\plugins\com.ibm.etools.server.jdk\jre\bin
@rem MQ JMS
set MQ=%MQ%;%MQ_JAVA_INSTALL_PATH%\lib
set MQ=%MQ%;%MQ_JAVA_INSTALL_PATH%\lib\com.ibm.mq.jar
set MQ=%MQ%;%MQ_JAVA_INSTALL_PATH%\lib\com.ibm.mqjms.jar
set MQ=%MQ%;%MQ_JAVA_INSTALL_PATH%\lib\jms.jar
set MQ=%MQ%;%MQ_JAVA_INSTALL_PATH%\lib\connector.jar
set MQ=%MQ%;%MQ_JAVA_INSTALL_PATH%\lib\fscontext.jar
set MQ=%MQ%;%MQ_JAVA_INSTALL_PATH%\lib\providerutil.jar
set MQ=%MQ%;%WAS_HOME%\lib\resources.jar
set CLASSPATH=%MQ%;%CLASSPATH%
set PATH=%JAVA_HOME%;%MQ_JAVA_INSTALL_PATH%\lib;%PATH%; |
setenv.batでは、JMSAdminが適切に機能するために必要な環境変数を設定します。setenv.batのこのバージョンとこの記事の第1回で使用されたバージョンとの唯一の違いは、WebSphere Application Serverランタイム・ライブラリーからのresources.jarファイル組み込みの有無です。このファイルには、JTA対応のWebSphere MQクラスが含まれています。
次に、以下に示す、管理オブジェクトを作成するスクリプトsetup.ejbを見てみます。
setup.ejb
chg ctx(mq)
def wsqcf(EJBQCF) qmgr(QM2)
def q(EJBQueue) qmgr(QM2) queue(Q2)
end |
この時点では、このスクリプトは、QueueConnectionFactory を定義する行以外は普通のスクリプトに見えます。このスクリプトは、WebSphere Application ServerでJTAトランザクションに関与するJMSコードで使用するQueueConnectionFactory (WSQCF) を作成します。
この管理オブジェクトが、この記事の第1回で作成したWebSphere MQオブジェクトを指すことに注意してください。
これで、スクリプト・ファイルを使用して構成コマンドを実行し、管理オブジェクトを作成できます。第1回で提供されたJMSAdmin構成ファイルJMSAdmin.fscontext.configを使用します。
- コマンド・プロンプトを開く。
- ディレクトリーをC:\WSMQ\Java\binに変更する。
-
setenv とタイプしてEnter を押す。
-
JMSAdmin<setup.ejb -cfg JMSAdmin.fscontext.config とタイプしてEnter を押す。
-
exit とタイプしてEnter を押す。
Application Server JMS参照の作成
次に、Application ServerのJMSプロバイダー構成でJMSオブジェクトを定義します。
- Application DeveloperでServerパースペクティブに切り替える。
- Serversビューで、TestServerを右クリックし、Start を選択する。
- "Server Default Server open for e-business" というメッセージが表示されるのを待って次に進む。
- Serversビューで、TestServerを右クリックし、Run administrative client を選択する。
- Login画面でSubmit をクリックする。
-
Resources の横にある+ 記号をクリックする。
-
JMS Providers の横にある+ 記号をクリックする。
-
WebSphere MQ の横にある+ 記号をクリックする。ここでは、この記事の第1回で定義したJMSプロバイダーを使用します。
-
JMS Destinations をクリックする。
-
New をクリックする。
-
Name: フィールドに
EJBQueue とタイプする。
- JNDI Name: フィールドに、
jms/EJBQueue とタイプする。
-
Destination Type: フィールドを
QUEUE に設定する。
-
External JNDI Name: フィールドに
mq\EJBQueue とタイプする。(スラッシュ / ではなく、円記号\ を使用する点に注意してください。)
-
OK をクリックする。
-
JMS Connection Factories をクリックする。
-
New をクリックする。
-
Name: フィールドに
EJBQCF とタイプする。
-
JNDI Name: フィールドに
jms/EJBQCF とタイプする。
-
External JNDOI Name: フィールドに
mq\EJBQCF とタイプする。(スラッシュ / ではなく、円記号\ を使用する点に注意してください。)
-
Connection Type: フィールドを
QUEUE に設定する。
-
OK をクリックする。
- Webブラウザーの上部にあるメニュー・バーでSave をクリックする。
-
OK をクリックし、構成を保存する。
- Webブラウザーの上部にあるメニュー・バーでExit をクリックする。
- Webブラウザーの横にあるX 記号をクリックしてWebブラウザーを閉じる。
- ServersビューでTestServerを右クリックし、Stop を選択する。

 |
データソースの作成
サンプル・アプリケーションをテストする前の最後のステップは、MessageData を、作成済みのデータベースに接続するデータソースを作成することです。JTAトランザクションに関与するようにデータベースを構成してはありますが、すべてが適切に機能するためには、JTA対応のJava Database Connectivity (JDBC) ドライバーも使用する必要があります。
- Server Configurationビューで、Server Configurationsの下のTestServer をダブルクリックする。
-
Data source タブをクリックする。
-
JDBC driver list リストボックスの横にあるAdd... ボタンをクリックする。
-
Name: フィールドに、
Db2JtaDriver とタイプする。
-
Implementation class name: フィールドに、
COM.ibm.db2.jdbc.DB2XADataSource とタイプする。
-
URL prefix: フィールドに
jdbc:db2 とタイプする。
-
Class path: フィールドに
C:/SQLLIB/java/db2java.zip とタイプする。
-
OK をクリックする。
- 今作成したJDBCドライバーを選択し、Data source defined in the JDBC driver selected above: リストボックスの横にあるAdd... ボタンをクリックする。
-
Name: フィールドに
JMSDB とタイプする。
-
JNDI name: フィールドに
jdbc/jmsdb とタイプする。
-
Database name: フィールドに
jmsdb とタイプする。
-
Enable JTA チェックボックスにチェックを入れる。
-
OK をクリックする。
-
Ctrl-S を押して、構成を保存する。
-
TestServer の横にあるX 記号をクリックしてサーバー構成エディターを閉じる。
- Application Developerをいったん停止してから再起動する。これにより、DB2をインストールしたときに変更されたオペレーティング・システムPATH変数をApplication Developerで認識することができます。
サンプル・アプリケーションのテスト
サンプル・アプリケーションをテスト・サーバーで実行するように割り当てると、テストする準備が整います。
- Server Configurationビューで、Server Configurationsの下のTestServerを右クリックし、Add Project>TransMQEAR を選択する。
- Serversビューで、TestServerを右クリックし、Start を選択する。
- "Server Default Server open for e-business" というメッセージが表示されるのを待って次に進む。
- NavigatorビューでTransMQWebを右クリックし、Run on Server を選択する。
- Input Formで、Text: フィールドに任意のテキストをタイプしてSubmit をクリックする。
- Result Formに "Message successfully processed" と表示される。
- MQSeries Explorerを使用して、メッセージがキュー・マネージャーQM2のキューQ2に着信したことを確認する。
- DB2 Control Centerに切り替え、JMSDB データベースのTables フォルダーに移動する。
- MessageDataテーブルを右クリックし、Sample Contents を選択する。テキストからデータベース行が作成されていることがわかります。Close をクリックする。
- Webブラウザーの戻る をクリックし、Text: フィールドに
JMS exception とタイプしてSubmit をクリックする。Result Formに "Error processing message" と表示されます。コンソールで確認すると、"Thrown to simulate JMS error" というメッセージを持つEJBException がスローされたことがわかります。MQSeries ExplorerおよびDB2 Control Centerを使用して、メッセージが送信されていないことと行が書き込まれていないことを確認します。
- Input FormのText: フィールドに
DB exception とタイプする。
まとめ
ここまで見てきたように、JMSメッセージの処理と関係データベース・アクセスを同一トランザクションで実行するための手段は、構成で設定するものであって、プログラミングで対応するものではありません。JMSの側での対応は実に簡単です。JMSAdminで使用するスクリプトにある1行を、標準
QCF の代わりにWSQCF を作成するように変更するだけです。データベースの側ではもう少し作業が必要です。データベースとJDBCドライバーの両方に特別な構成が必要です。その方法はここで説明したので、使用するアプリケーションにこの強力な機能を組み込むことができます。
ダウンロード | ファイル名 | サイズ | ダウンロード形式 |
|---|
| i-mqejb2.zip | | HTTP |
参考文献
著者について  | 
|  | Willy Farrellは、IBMのビジネス・パートナーへの教育、補助、相談を行う組織であるIBM Developer Relations Technical Consulting (別名The DragonSlayers) に勤務しています。1981年以来、コンピューター・プログラミングを主業務としており、1996年にJavaを使い始め、1998年にIBMに入社しました。Willyはさまざまな資格を取得していますが、その中でも有力な技術認定としてJava 2 Programmer、WebSphere Application Server Enterprise Developer、WebSphere Studio Application Developer Solution Developer、MQSeries Solutions Expert、IBM e-business Solution Technologistがあります。 |
記事の評価
|