IBM Bluemix MQ Light サービスを利用して複数のアプリケーションを統合する

2014年 8月 28日
PDF (411 KB)
 
Mark Phillips

Mark Phillips

MQ Cloud Technical Lead

@markphillips

Melanie Rao

Melanie Rao

MQ Cloud Software Engineer

IBM MQ Light はベータ版の製品であり、継続的に改良を重ねて使いやすくしていることから、今後も変わり続けるはずです。

IBM Bluemix™ にサインアップ
無償のサービス、ランタイム、インフラを含むクラウド・プラットフォームが、新たなモバイルやウェブ・アプリのクイックな構築とデプロイを実現します。

IBM Bluemix にデプロイされたアプリケーションに対し、MQ Light は柔軟で使いやすいメッセージング・サービスを提供します。MQ Light をキューイング・サービスとして使用すれば、キューという手段によって、単一のメッセージを個々の受信者に送信することができます。あるいはパブリッシュ/サブスクライブ・ブローカーとして使用すれば、複数の受信者に通知を送信することも可能になります。このサービスは、例えば数多くの動画を処理する必要があるモバイル・アプリケーションや Web アプリケーションなどで利用することができます。こうした CPU インテンシブな処理は、MQ Light によってクラウド上のバックエンド・ワーカー・アプリケーションの複数のインスタンスにオフロードすることができます。そして、これらのワーカーのそれぞれが応答キューに非同期で応答することで、モバイル・アプリケーションや Web アプリケーションが応答を収集することができます。

MQ Light Java Message Service (JMS) API と MQ Light API という 2 つの API がサポートされています。

  • MQ Light JMS API は、Java Enterprise Edition (Java EE) アプリケーションがポイントツーポイント・モデルまたはパブリッシュ/サブスクライブ・モデルに基づいてメッセージングを実行するために使用する、標準的な Java Messaging API です。この API は、この記事で紹介するサンプル・アプリケーションで使用されます。
  • MQ Light API は、Node.js アプリケーションをサポートします。この API は簡単に使えるように設計されており、スケーラブルで応答性に優れたアプリケーションであるために必要なメッセージング機能の基本部分を提供しています。詳しくは、IBM Messaging 「MQ Light concepts」を参照してください。

一旦 MQ Light を構成してしまえば、MQ Light を使用するサービスでは、ほとんどのケースで継続的に管理をする必要がありません。

このサービスで発生する可能性のある問題については、Bluemix 開発者コミュニティー・サイトの「Get help」ページにアクセスしてください。

アプリケーションを作成するために必要となるもの

 
  • Java および Java 開発環境についての十分な知識
  • メッセージングの概念に関する基礎知識
  • Bluemix アカウント
  • CloudFoundry の cf コマンド・ライン・ツール (cf コマンド・ライン・ツールをインストールして使用する方法を学ぶには、Bluemix Command line interface の指示に従ってください)
  • Apache Ant
  • Git
  • IBM DevOps Services プロジェクト (sample.web と sample.worker の両部分のソース・コードが含まれています。この記事の「コードを入手する」ボタンをクリックしてください)

ステップ 1. MQ Light JMS API を導入する

 

MQ Light JMS API の使い方を理解できるように、まずは、サンプル・アプリケーションをデプロイする方法を簡単に説明します。このサンプル・アプリケーションは、Bluemix 上の MQ Light インスタンスにバインドし、ユーザーが入力した英語の文を取得して、その文に含まれる単語を大文字に変換します。

MQ Light が英語の文を単語に分割し、大文字の単語に変換して応答を送信する仕組みを示す図

このサンプルは、次の 2 つのコンポーネントからなります。

  • Java サーブレットとして実装される Web アプリケーション。この Java サーブレットは Java EE の 1 つの .war ファイルとしてパッケージ化されます。このアプリケーションは、Web ページで入力されたテキストを受け取り、そのテキストを単語に分解してから、それらの単語をワーカー・アプリケーションに送信します。そして、処理された単語を応答メッセージとして受信して、それらのメッセージをWeb ページ上にワーカー ID ストリングと併せて動的に表示します。このサーブレット Web アプリケーションによって、JEE アプリケーションを Liberty にデプロイする方法、MQ Light への接続を確立するために JNDI ルックアップを使用する方法、キューとの間でメッセージを送受信する方法を実演します。
  • Bluemix にデプロイされる Java SE ワーカー・アプリケーション。このアプリケーションは、ユーザーが入力した英語の文を取得し、各単語を大文字に変換してから、キューに入れます。Java JMS ワーカー・プログラムでは、MQ Light ヘルパー・クラスを使用して JMS アプリケーションを MQ Light サービス・インスタンスにバインドする方法、あるキューから要求メッセージを取得し、別のキューに応答メッセージを入れるために MQ Light プロトコルを使用する方法、そしてキューのメッセージを処理するために複数のワーカー・アプリケーションを使用する方法を実演します。

ステップ 2. ソース・コードをダウンロードしてコンパイルする

 

このサンプルのソース・コードは、IBM DevOps Services プロジェクトに保管されています。サンプルをダウンロードしてビルドするには、Git リポジトリーと Java SDK を複製する必要があります。この記事の最初のほうにある「コードを入手する」ボタンをクリックすると、IBM DevOps Services プロジェクトからコードを入手することができます。

ソース・コードを入手し、サンプルのコンポーネントをビルドするには、以下の手順に従います。

  1. IBM DevOps Services プロジェクトで指定された Git URL を使用して、Git リポジトリーを複製します (ヘルプを表示するには、DevOps Services の「HELP (ヘルプ)」セクションを参照してください)。
  2. 最上位レベルのディレクトリーから ant を実行して、この Web アプリケーション用のバイナリーと、ワーカー・アプリケーション用のバイナリーをビルドします。これにより、Web アプリケーション用のバイナリーが mqlightsampleweb に生成され、ワーカー・アプリケーション用のバイナリーが mqservicesampleworker に生成されます。ソース・コードを変更する場合は、ant をもう一度実行して、更新されたバイナリーを生成します。

ステップ 3. JMS ワーカー・アプリケーションを扱う

 

以下のコードに、エラー・チェックと宣言を省いて簡素化したプログラムを示します。

MQLightConnectionHelper connHelper = 
 MQLightConnectionHelper.getMQLightConnectionHelper();			
Connection conn = connHelper.getJmsConnectionFactory()
			.createConnection(connHelper.getUsername(), connHelper.getPassword());
Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
conn.start();
Queue queue = sess.createQueue("jms/requestQueue");
MessageConsumer consumer = sess.createConsumer(queue);
while (errorCount < 10) {
     Message message = consumer.receive();
     Destination replyDestination = message.getJMSReplyTo();
     MessageProducer replyProducer = sess.createProducer(replyDestination);
     TextMessage replyMessage = sess.createTextMessage();
     msg = ((TextMessage) message).getText().toUpperCase();
     replyMessage.setText(msg + "\tProcessed by worker ID: " + ID);
     replyMessage.setJMSReplyTo(null);
     replyProducer.send(replyMessage);
     replyProducer.close();
}
sess.close();
conn.close();

最初の行を除き、このコードは典型的な JMS コンシューマー・プログラムです。このプログラムでは、要求キューのメッセージを使用して、ある作業 (メッセージを大文字に変換する作業) を実行し、処理されたメッセージを応答キューに格納します。

最初の行では、提供されている MQLightConnectionHelper クラスを使用して、JMSConnectionFactory を取得するプロセスを単純化しています。MQLightConnectionHelper クラスはインスタンス化の際に、VCAP_SERVICES 環境変数を解析します。この環境変数には、アプリケーションにバインドされている最初の MQ Light インスタンスに接続するために必要な情報が含まれています。引数を取らない静的なゲッターは、コネクション・ファクトリーや接続情報を取得するために以下のメソッドを使用してシングルトン・ヘルパーを返します。

getJMSConnectionFactory() // Get a JMSConnectionfactory to the default connection
getUsername() // The user credential for the bound service as a string
getPassword() // The password credential for the bound service as a string
getConnectionLookupURI() // The URI of the client connection definition table used to connect to the qmgr

ステップ 4. JMS Web アプリケーションを扱う

 

この Java サーブレットは、HTML クライアントで表示される Web ページから送信された HTTP POST への応答として、バックエンド・サービスに要求メッセージを送信します。以下のコード・スニペットに示すのは、エラー・チェックと宣言が削除されて簡素化されたプログラムです。

サーブレットがパッケージ化されている WAR (Web Application Archive) ファイルには、アプリケーションのデプロイ先のコンテナーが提供する Web コンテンツと一緒に、デプロイメントに関する記述子 (web.xml) が含まれています。MQ Light サービスを利用して、キューとの間でメッセージを出し入れするには ConnectionFactory が必要です。コネクション・ファクトリーは、デプロイメント記述子内にリソース参照として記述されます。

<resource-ref>
	<description> ConnectionFactory used to send and receive messages to and 
      from the back-end worker.
	</description>
	<res-ref-name>jms/mqlsampleservice</res-ref-name>
	<res-type>javax.jms.ConnectionFactory</res-type>
	<res-auth>Container</res-auth>
	<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

サーブレットが初期化され、コンテナー JNDI 空間に対する InitialContext が取得されることで、ローカル JNDI 空間からコネクション・ファクトリーのルックアップが可能になります (注: このルックアップでは、mqlsampleservice という名前が付けられているバインド済みサービス・インスタンスを利用します)。必要なローカル・リソースは、ここでプログラムによって JMS API を使用して作成されます。

InitialContext ctx = new InitialContext();
ConnectionFactory myCf = (ConnectionFactory)ctx.lookup("java:comp/env/jms/mqlsampleservice");
Queue myRequestQueue =  session.createQueue("jms/requestQueue");
Queue myReplyQueue =  session.createQueue("jms/replyQueue");

ユーザーによる入力が Web ページを介して HTTP リクエストとして送信されると、2 つのステップが実行されます。最初のステップでは、サンプル Web ページに入力されたテキストに含まれる単語ごとに、要求メッセージがバックエンド・ワーカー・アプリケーションに対して送信されます。

	String message = (String) request.getParameter("message");
	Connection connection = myCf.createConnection(username, password);
	Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
	MessageProducer producer = session.createProducer(myRequestQueue);
	connection.start();
	for (String word : messages) {
		TextMessage requestMsg = session.createTextMessage(word);
		requestMsg.setJMSReplyTo(myReplyQueue);
		producer.send(requestMsg);
	}
	producer.close();
	session.close();
	connection.close();

2 番目のステップでは、応答キューにバックエンド・ワーカー・プロセスからの応答があるかどうかがチェックされます。ワーカー・スレッドからの応答がある場合、その応答の内容を基に HTML レスポンスが作成され、それが最初の問い合わせに対する HTTP レスポンスとして返されます。これにより、Web ページにはワーカーによる処理の結果を表示することができます。

	Connection connection = myCf.createConnection(username, password);
	connection.start();
	Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
	MessageConsumer consumer = session.createConsumer(myReplyQueue);
	while ((replyMsg = (TextMessage) consumer.receive(1000)) != null) {
		replyMsgTxt.add(replyMsg.getText());
	}

	consumer.close();
	session.close();
	connection.close();

	generateReply(response, "SUCCESS!", replyMsgTxt);

ステップ 5. Bluemix 上でデプロイして実行する

 
  1. まだ JMS Web アプリケーションとワーカー・アプリケーションをビルドしていない場合には、最上位にあるディレクトリーで ant を実行することで、これらのアプリケーションをビルドします。これにより、mqlightsampleworker 内に MQLightSampleWorker.jar という名前の JAR ファイルが生成され、mqlightsampleweb 内には MQLightSampleWeb.war という名前の WAR ファイルが生成されます。
  2. CloudFoundry コマンドライン・インターフェースを使用して Bluemix にログインします (詳細は、「Logging in to Bluemix」を参照)。
    cf login
  3. cf コマンドライン・インターフェースを使用して MQ Light サービスのインスタンスを作成します。このインスタンスは、サンプルの Web アプリケーションとワーカー・アプリケーションの両方で共有されます。このサービス・インスタンスには、この記事のステップ 4 で説明したように、mqlsampleservice という名前を付けなければなりません。
    cf create-service mqlight Default mqlsampleservice

    作成したサービスを一覧に表示するには、以下のコマンドを入力します。

    cf services
  4. 両方のアプリケーションをプッシュし、作成したサービス・インスタンスにこれらのアプリケーションをバインドします。
    cf push

    このコマンドは、manifest.yml に指定されている構成を用いて、以下のステップを自動的に実行します。
    1. MQL.sample.worker という名前のアプリケーションを作成し、MQLightSampleWorker.jar をアップロードします。
    2. MQL.sample.worker を MQ Light サービス・インスタンスにバインドします。
    3. MQL.sample.worker アプリケーションのインスタンスを 2 つ起動します。それぞれには、512 MB のメモリーを使用可能に設定します。
    4. MQL.sample.web という名前のアプリケーションを作成し、MQLightSampleWeb.war をアップロードします。
    5. MQL.sample.web への一意のルートを作成してバインドすることで、外部からアプリケーションにアクセスするための URL を提供します。この URL は、ホスト属性に ${random-word} キーワードを使用してランダムなストリングを生成することで、一意の URL にしています。
    6. MQL.sample.web アプリケーションを MQ Light サービス・インスタンスにバインドします。
    7. 使用可能なメモリーとして 512 MB を設定して、MQL.sample.web アプリケーションのインスタンスを 1 つ起動します。
  5. Web アプリケーションの URL (cf push コマンドの実行結果の最後 (“urls” ストリングの隣) に表示されます) をコピーしてブラウザーのアドレス・バーにペーストすることで、この Web アプリケーションを表示することができます。以下の画像に示すように、Web ページの入力ボックスに文を入力して、「Submit Work (ワークの送信)」ボタンをクリックすることで、ワーカー・オフロードの動作を確認することができます。入力した文が MQ Light を介してワーカー・スレッドに送信されて処理されると、各単語を処理したワーカー・スレッドの ID と併せて処理結果が表示されます。入力ボックスを表示するサンプル・アプリケーションの Web UI を示す画

まとめ

 

以上で作業は完了です!これで、ワーカー・アプリケーションの複数のインスタンスが、MQ Light メッセージング・サービスとその JMS API を使用して Web フロントエンドと通信できるようになりました。すべてはクラウド上にホストされているため、このアプリケーションはどこからでも使用することができます。


関連トピック:Bluemix Developers CommunityUsing WebSphere MQ classes for JMSMQ Light

コメントの追加

注意: HTML コードは、コメント内ではサポートされません。


残り 1000 文字

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=WebSphere, Cloud computing
ArticleID=972981
ArticleTitle=IBM Bluemix MQ Light サービスを利用して複数のアプリケーションを統合する
publish-date=08282014