読者です 読者をやめる 読者になる 読者になる

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

JBossでJMSを使って、Queueからメッセージを受け取るサンプル

<スポンサーリンク>

前回の記事でJBossを使ってJMSのメッセージをキューに送信するところまで実装した。
今度はそれを取り出すサンプルを作ってみた。

QueueConnectionFactoryとか、QueueのJndi名はベタ書きしているが、本来は外出しするべきだ。
まずはMBeanサービスを作るためのインターフェースから。

package sample.jndi;

public interface SampleJndiReceiverServiceMBean {
	String getQueueJndiName();
	void setQueueJndiName(String queueJndiName);
	String getQueueConnectionJndiName();
	void setQueueConnectionJndiName(String queueConnectionJndiName);
	void receiveMessage();
}

このインターフェースを実装するMBeanサービスはこちらになる。

package sample.jndi;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class SampleJndiReceiverService implements SampleJndiReceiverServiceMBean {

	private String queueJndiName;
	private String queueConnectionJndiName;
	private QueueConnection queueConnection;
	private QueueSession queueSession;
	private QueueReceiver queueReceiver;
	private Queue queue;

	public String getQueueJndiName() {
		return this.queueJndiName;
	}

	public void setQueueJndiName(String queueJndiName) {
		this.queueJndiName = queueJndiName;
	}

	public String getQueueConnectionJndiName() {
		return this.queueConnectionJndiName;
	}

	public void setQueueConnectionJndiName(String queueConnectionJndiName) {
		this.queueConnectionJndiName = queueConnectionJndiName;
	}

	public void receiveMessage() {
		System.out.println("キューからメッセージを受信します");
		Context context;
		try {
			context = new InitialContext();
			QueueConnectionFactory queueFactory = (QueueConnectionFactory)context.lookup("QueueConnectionFactory");
			queueConnection = queueFactory.createQueueConnection();
			queueSession = queueConnection.createQueueSession(false,  Session.AUTO_ACKNOWLEDGE);
			queue = (Queue)context.lookup("queue/testQueue");
			queueReceiver = queueSession.createReceiver(queue);
			queueConnection.start();

			//テキストを受信する
			String text = null;
			Message msgBody = queueReceiver.receive();
			if (msgBody instanceof TextMessage) {
				text = ((TextMessage) msgBody).getText();
			}

			System.out.println("テキストを受信しました");
			if (text != null) {
				System.out.println("テキストメッセージは:" + text);
			}

			queueReceiver.close();
			queueSession.close();
			queueConnection.close();
		} catch (NamingException e) {
			e.printStackTrace();
		} catch (JMSException e) {
			e.printStackTrace();
		}

	}
}

さて、この作ったMBeanサービスをjboss-service.xmlを編集してJBossにMBeanサービスとして登録しよう。

<?xml version="1.0" encoding="UTF-8"?>

<server>
  <mbean code="sample.jndi.JndiLookupSampleService" name="sample.jndi:service=JndiLookupSample">
    <attribute name="JndiName">queue/testQueue</attribute>
  </mbean>
  <mbean code="sample.jndi.SampleJndiReceiverService" name="sample.jndi:service=JmsReceiveSample">
    <attribute name="QueueJndiName">queue/testQueue</attribute>
    <attribute name="QueueConnectionJndiName">QueueConnectionFactory</attribute>
  </mbean>
</server>

と、こんな感じでサービスを登録すると、jmx-consoleのMBean viewに
service=JmsReceiveSample
というサービスが出てくるようになる。

前回の記事のようにQueueにメッセージを投げたあと、
void receiveMessage()
をinvokeすると・・・・

コンソールには

23:52:35,593 INFO  [AjpProtocol] Starting Coyote AJP/1.3 on ajp-127.0.0.1-8009
23:52:35,604 INFO  [Server] JBoss (MX MicroKernel) [4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=230807181423)] Started in 9s:189ms
23:52:46,704 INFO  [STDOUT] JNDI名:queue/testQueue
23:52:46,712 INFO  [STDOUT] コネクションファクトリ:org.jboss.resource.adapter.j
ms.JmsConnectionFactoryImpl@66b06b
23:52:46,766 INFO  [STDOUT] queue/testQueue=QUEUE.testQueue
23:52:46,770 INFO  [STDOUT] キューにメッセージを送信します
23:52:46,774 INFO  [STDOUT] キューへの接続を閉じます
23:52:57,556 INFO  [STDOUT] キューからメッセージを受信します
23:52:57,587 INFO  [STDOUT] テキストを受信しました
23:52:57,588 INFO  [STDOUT] テキストメッセージは:Hello JBoss JMS!

こんな感じでキューから取り出したJMS Messageを表示することができた。

読んだ本

標準J2EEテクノロジー〈1〉基礎から学ぶEJB (Super Java Books)

標準J2EEテクノロジー〈1〉基礎から学ぶEJB (Super Java Books)

  • 作者: マーティンボンド,デビーロー,ピーターロクスバーグ,ダンヘイウッド,アンディロングショー,Martin Bond,Debbie Law,Peter Roxburgh,Dan Haywood,Andy Longshaw,ウルシステムズ株式会社,千菊健,トップスタジオ
  • 出版社/メーカー: 翔泳社
  • 発売日: 2003/03
  • メディア: 単行本
  • クリック: 5回
  • この商品を含むブログ (3件) を見る