NetBeansおよびGlassFishを使用した、簡単なJava Message Service(JMS)プロデューサの作成
概要
- こちらのリンクからJava JDK 7をダウンロードし、インストールします。
- こちらのリンクからNetBeans IDE 7.1.2 Java EEバージョンをダウンロードし、インストールします。このソフトウェアには、GlassFish 3.1.2(Java EEダウンロード・バンドル)が含まれています。
インストール中に、GlassFishをインストールするためのチェック・ボックスを必ず選択してください。 JUnitのインストールは省略可能であり、このチュートリアルでは必要ありません。
- ソフトウェア要件に記載されたソフトウェアをインストールしていること。
- NetBeans IDEを起動していること。
- このチュートリアルに必要なNetBeansプロジェクトが含まれているMDBExample.zipファイルをダウンロードし、解凍していること。
注: NetBeansプロジェクトを解凍するフォルダには、英数字以外の文字や空白を使用しないでください。
目的
このチュートリアルでは、GlassFish 3.1.2およびNetBeans 7を使用して、JMS APIを使用した簡単なメッセージ・プロデューサを作成する方法について説明します。
所要時間
約45分
はじめに
メッセージングは、ソフトウェア・コンポーネント間やアプリケーション間での通信手段です。 メッセージングは分散アプリケーション間での疎結合通信を可能にします。 メッセージ・クライアントは、メッセージの受信と配信に役立つメッセージング・エージェントに接続することで、メッセージングの送受信を行います。 クライアント側では、メッセージを消費または生成するその他のクライアントについて把握する必要はありません。 メッセージ・クライアントが知っている必要があるのは、送信メッセージの形式と宛先のみです。 したがって、メッセージングは、アプリケーション側でリモート・アプリケーションのメソッドを把握する必要のあるその他の密結合テクノロジー(Remote Method Invocation(RMI)など)とは異なります。
Java Message Service APIは、エンタープライズ・メッセージング製品(メッセージ指向ミドルウェア(MOM)とも呼ばれる)を介して企業内アプリケーションを接続するという要望に応じるため、Sun Microsystemsなどの企業によって設計されました。 JMSはJavaアプリケーションからメッセージング・システムへのアクセス手段を提供します。 JMSは、一連のインタフェースに加えて、JMSクライアントがメッセージ実装機能にアクセスする方法を定義した関連セマンティックで構成されています。 この点において、JMSはJDBCに非常によく似ています。
メッセージング・システムはPeer-to-Peer機能であるため、クライアントはどのクライアントに対してもメッセージを送受信することができます。 一部のメッセージング・システムは多数の宛先にメッセージをブロードキャストできるため、クライアントが特定のチャネルまたはトピックをサブスクライブすることでブロードキャストされたメッセージを受信できます。 JMSはJMSプロバイダの実装に応じて、両方のモデルをサポートするように実装されています。 次の図に、Java Message Service実装に関係するコンポーネントを示します。

JMS APIメッセージング・システムに関係するコンポーネント
JMSテクノロジー・プロバイダ(JMSプロバイダ)は、JMS APIの実装を提供するメッセージング・システムです。 JMSテクノロジーをサポートするアプリケーション・サーバーに対して、このアプリケーション・サーバーのJNDIテクノロジー名前空間に管理対象オブジェクト(コネクション・ファクトリ、キュー宛先、トピック宛先)を配置する必要があります。 通常は、アプリケーション・サーバーで提供されている管理ツールを使用してこのタスクを実行しますが、 このチュートリアルでは、NetBeansに組み込まれた機能を使用して管理対象オブジェクトの定義と作成を行います。
具体的に言うと、キュー宛先とコネクション・ファクトリをNetBeans内に定義します。 アプリケーションをデプロイした後で、NetBeansの機能を使用し、指定したコネクション・ファクトリを使用するコードを生成して、コネクション・オブジェクトを生成します。 生成されたコードはこのコネクション・オブジェクトを使用してセッション・オブジェクトを作成します。このセッション・オブジェクトを使用してMessageProducerオブジェクトが作成され、JSFページに入力された文字列がメッセージ・オブジェクトとしてキューに送信されます。
ソフトウェア要件
Windowsプラットフォームでこのチュートリアルを実行するには、次のソフトウェアが必要です。 ソフトウェアは次に示す順序でインストールする必要があります。
前提条件
このチュートリアルを始める前に以下のことを確認してください。
NetBeansのWebアプリケーション・プロジェクトの作成
NetBeansはさまざまなプロジェクト・オプションを提供しています。 このチュートリアルではWebアプリケーション・プロジェクトを作成し、JSFフレームワークを使用します。
新しいWebアプリケーション・プロジェクトを作成します。
「File」→「New」→「Project」を選択します。

New Projectダイアログで、Categoriesから「Java Web」を選択し、Projectsから「Web Application」を選択します。 「Next」をクリックします。

Project NameにJSFProducerと入力します。
任意のプロジェクト・ロケーションを入力します。
「Next」をクリックします。

「Enable Contexts and Dependency Injection」を選択します。 「Next」をクリックします。

Frameworksから「JavaServer Faces」を選択します。 「Finish」をクリックします。

NetBeansによって、index.xhtmlというJSF Faceletを含むJSFベースの簡単なWebアプリケーションが作成されました。
JMSプロデューサ用マネージドBeanの作成
このトピックでは、JSF Facelet用のマネージドBeanを作成します。
新しいJSFマネージドBeanの作成
作成したプロジェクトを開きます。 「Source」パッケージを右クリックし、「New」→「Other」を選択します。

Categoriesから「Java Server Faces」を選択し、File Typesから「JSF Managed Bean」を選択します。 「Next」をクリックします。

Class NameにMessageProducerBean と入力します。
Packageにobeと入力します。
BeanのScopeとして「request」を選択します。
「Finish」をクリックします。

String型のメッセージ・フィールドを含むJSFマネージドBeanの実装
String型のメッセージ・フィールドをマネージドBeanに追加します。
private String message;

NetBeansのコード挿入機能を使用して、このフィールドのgetterとsetterを追加します。 「MessageProducerBean」ファイルの最後の閉じかっこの真上をクリックし、[Alt]を押しながら[Insert]キーを押して、Generateリストから「Getter and Setter」を選択します。

「message」フィールドを選択します。 「Generate」をクリックします。

getterとsetterの下に、戻り型がvoidの空のsend()メソッドを追加します。
ファイルを保存します。

JSFページの実装
マネージドBeanのメッセージ・フィールドに書込みを実行するためのコンポーネントをJSFページに追加します。
Web Pagesフォルダを開き、index.xhtmlファイルを開きます。 ページに次のマークアップを追加し、Hello from Facelets文字列を置き換えます。
JMS Message Producer
<h:form>
<h:outputLabel value="Message: " for="message"/>
<h:inputText id="message" value="#{messageProducerBean.message}"/>
<h:commandButton value="Send Message" action="#{messageProducerBean.send}"/>
<h:messages globalOnly="true"/>
</h:form>

JSFページのタイトルをJMS Message Producerに変更します。 ファイルを保存します。

プロジェクトへのメッセージ・キューとコネクション・ファクトリの追加
JMSキューの管理オブジェクト・リソースの追加
プロジェクトを右クリックして、「New」→「Other」を選択します。
Categoriesから「GlassFish」を選択し、File Typesから「JMS Resource」を選択します。
「Next」をクリックします。

JNDI Name(jms/myQueue)とAdmin Object Resourceはデフォルトのままにします。 「Next」をクリックします。

JMS Properties画面でValueフィールドにmyQueueと入力し、[Enter]キーを押します。
「Finish」をクリックします。

JMSキューのコネクタ・リソースの追加
プロジェクトを右クリックして、「New」→「Other」を選択します。
Categoriesから「GlassFish」を選択し、File Typesから「JMS Resource」を選択します。
「Next」をクリックします。

JNDI Nameにjms/myQueueFactoryと入力します。
Connector Resourceとして「javax.jms.QueueConnectionFactory」を選択します。
「Finish」をクリックします。

GlassFishアプリケーション・サーバーの起動とアプリケーションのデプロイ
Servicesタブを開き(「Windows」→「Services」)、「Servers」を開きます。
「GlassFish Server 3.1.2」を右クリックし、「Start」を選択します。
注: GlassFishインスタンスの魚アイコンの横に緑色の三角マークが表示されている場合、サーバーは起動済みであり、Startコマンドはグレーアウトされます。

OutputウィンドウにGlassFish 3.1.2コンソールが表示され、GlassFishの起動が示されます。
注:Java DB Databaseも自動的に開始されます。

「Projects」タブを選択して開きます。
「JSFProducer」プロジェクトを右クリックして、「Deploy」を選択します。

JSFProducerプロジェクトが正しく構築されたことを示すメッセージがOutputウィンドウに表示されます。

「Services」タブを開きます。 「Applications」フォルダを右クリックして「Refresh」を選択し、JSFProducerアプリケーションのデプロイを確認します。
「Resources」フォルダを開き、「Connectors」フォルダを開きます。
「Admin Object Resources」を右クリックし、「Refresh」を選択します。
「Connector Resources」フォルダと「Connector Connection Pools」フォルダに対して同じ処理を繰り返します。
GlassFishによってJSFProducerアプリケーションがデプロイされ、jms/myQueue管理オブジェクト・リソースとjms/myQueueFactoryコネクタ・リソース・オブジェクトが作成されたことを確認します。

マネージドBean内のJMSコードの生成
MessageProducerBeanクラスをエディタで開き、ファイルの最後(閉じかっこの直前)をクリックします。
[Alt]を押しながら[Insert]を押してNetBeansのコード生成機能を開き、「Send JMS Message...」を選択します。

デフォルトで、Server Destinationには管理リソース・オブジェクト(jms/myQueue)が選択され、Connection factoryにはjms/myQueueFactoryが入力されます。 「OK」をクリックします。

ファイル上部までスクロールし、QueueインスタンスとConnectionFactoryインスタンスに対する適切なリソース宣言がNetBeansにより追加されていることを確認します。

もう一度下方向にスクロールし、NetBeansによって2つのプライベート・メソッドが追加されていることを確認します。
createJMSMessageForjmsMyQueueメソッドはTextMessageオブジェクトのインスタンスを作成して返します。
sendJMSMessageToMyQueueメソッドはConnectionFactoryを使用してConnectionを作成し、connectionからSessionを作成し、sessionからMessageProducerを作成します。
MessageProducerは、JMSキュー宛先に文字列メッセージを送信します(messageDataとしてメソッドに渡す)。
注:エディタの行番号はスクリーンショットとは異なる場合があります。

sendメソッドの変更による生成コードの呼出し
次のコードをsend()メソッドに追加します。
FacesContext facesContext = FacesContext.getCurrentInstance();
try {
sendJMSMessageToMyQueue(message);
FacesMessage facesMessage = new FacesMessage("Message sent: " + message);
facesMessage.setSeverity(FacesMessage.SEVERITY_INFO);
facesContext.addMessage(null, facesMessage);
} catch (JMSException jmse) {
FacesMessage facesMessage = new FacesMessage("Message NOT sent: " + message);
facesMessage.setSeverity(FacesMessage.SEVERITY_ERROR);
facesContext.addMessage(null, facesMessage);
}

send()メソッドは、先ほどプロジェクトに追加したJMSキュー宛先に対して文字列messageの送信を試みます。
メッセージが正しく送信されると、現在のビュー・ページを表すFacesContextインスタンスにFacesMessageが追加されます。 ページがレンダリングされると、FacesMessageがブラウザ・クライアントに表示されます。
不足しているインポートを修正し([Ctrl]と[Shift]を押しながら[I])、ファイルを保存します。

OutputウィンドウのGlassFish Server 3.1.2タブにアプリケーションが正しくデプロイされたことが示されますが、次の警告が表示されます。
注: 角かっこ内のメッセージ内容は環境によって異なる場合があります。

これらの警告は、先ほど作成したキューとコネクション・ファクトリに対して、NetBeansが移植可能なJNDIルックアップ参照を作成しようとしたことに起因します。 この例では、JMSリソースに対して移植可能でないmappedNameルックアップが使用されているため、この警告を無視して構いません。または、glassfish-web.xmlファイルから次に示す行を削除します。

これらの行を削除してからファイルを保存すると、GlassFishによって自動的にJSFProducerアプリケーションが再デプロイされ、警告は表示されません。

アプリケーションのテスト
ブラウザを開き、次のURLを入力します。
http://localhost:8080/JSFProducer/

何らかのテキストを入力し、「Send Message」ボタンをクリックします。
メッセージが正しく送信されることを確認します。 次に例を示します。

メッセージ・キュー統計の参照
サーバー上のメッセージの中身を表示することはできませんが、宛先に送信された(まだ取得されていない)メッセージの数を確認することはできます。
コマンドラインの使用
コマンド・ウィンドウを開きます ((「スタート」→「ファイル名を指定して実行」→「cmd」)
次のコマンドを入力します。
"C:\Program Files\glassfish-3.1.2\mq\bin\imqcmd" list dst
Usernameとしてadminを入力し、Passwordとしてadminを入力します。

myQueueには1つのメッセージが入っています。
管理コンソールの使用
ブラウザに次のURLを入力し、GlassFish Admin Consoleを起動します。
http://localhost:4848/common/index.jsf
左側のパネルから「server (Admin Server)」をクリックします。

「JMS Physical Destinations」タブを選択します。

myQueueの横にある「View」をクリックします。

Number of Messages統計情報が表示されるまで、下方向にスクロールします。

myQueueには1つのメッセージが入っていることが分かります。
キュー上のメッセージの読取り
このチュートリアルには、キュー上のメッセージを"表示"するための簡単なMessage-Driven Bean(MDB)プロジェクトが含まれています。 キューからメッセージを取得して別のアプリケーション用に保存する方法を含む、より高度なMDBアプリケーションについては、別のOBEで学習します。
MDBExample.zipプロジェクトをディレクトリに解凍し、NetBeansでこのプロジェクトを開きます。

MDBExample.javaファイルを開き、コードを確認します。

このコードはMessage Driven Bean(MDB)を使用して、"jms/myQueue"というJNDI名を持つキュー上のメッセージに対するリスナーをアプリケーション・サーバーに登録します。 Message Driven Beanはアプリケーション・サーバーにデプロイされ、コンテナによってインスタンス化されます。 デプロイされたBeanは、指定された宛先キュー上のメッセージを"リスニング"し続けます。
キューにメッセージが送信されると、コンテナがonMessageメソッドを呼び出すことで、MessageオブジェクトからTextMessageオブジェクト(キューに入れた型)へのキャストが行われます。 getText()メソッドを使用して、コンソールへメッセージを出力します。
「MDBExample」プロジェクトを右クリックして「Deploy」を選択し、GlassFishにこのMDBをデプロイします。

Outputウィンドウの「GlassFish Server 3.1.2」タブ(システム・コンソール)をクリックすると、JSFウィンドウに入力したメッセージが確認できます。

これで完了です。
まとめ
- The Java EE 6 Tutorial: Java Message Service Concepts
- Java Message Service Documentation
- Developing Java EE 6 Applications for the Java EE 6 Platform
- Java EEアプリケーションでのJava Message Serviceの使用について、詳しくはOracle Learning Libraryに含まれるその他のOBEを参照してください。
- カリキュラム開発責任者: Tom McGinn
- 共著者: Matt Heimer
このチュートリアルでは、JMSプロデューサ・アプリケーションを作成しました。 このアプリケーションはJSFページを使用して文字列メッセージとマネージドBeanを作成し、JMSメッセージ・キューに文字列を格納します。