2013/06/22

JMS 2.0チュートリアル with NetBeans 7.3.1 and GlassFish4


JMS 2.0チュートリアル with NetBeans 7.3.1 and GlassFish4
本チュートリアルは、「NetBeansおよびGlassFishを使用した、簡単なJava Message Service(JMS)プロデューサの作成」を参考にして作成しました。
JMSは一般的には、異なるJava EEアプリケーション間のコミュニケーション手段として使いますが、ここでは、1つのWebアプリケーションでJMS 2.0のキューを利用したメッセージ送信とメッセージ受信の両方を実装します。


【目次】
  1. Webアプリケーションプロジェクトの作成
  2. メッセージ送信処理の実装
    1. メッセージ送信するJSF管理対象Beanの作成
    2. メッセージ送信するJSFページの作成
  3. メッセージ受信処理の実装
  4. 実行してみる

Webアプリケーションプロジェクトの作成

以下の手順でWebアプリケーションのプロジェクトを作成します。
  1. NetBeansのメニューバーから、[ファイル] > [新規プロジェクト]を実行します。

  2. [新規プロジェクト]画面の[1. プロジェクトを選択]ステップにて、
    [カテゴリ]で[Java Web]、[プロジェクト]で[Webアプリケーション]を選択し、[次 >]を押下します。


  3. [新規 Webアプリケーション]画面の[2. 名前と場所]ステップにて、[プロジェクト名]に[JMSSample]を入力し、[次 >]を押下します。
    なお、[プロジェクトの場所]は任意です。


  4. [新規 Webアプリケーション]画面の[3. サーバと設定]ステップにて、
    次の画面のようになっていることを確認し、[次 >]を押下します。


  5. [新規 Webアプリケーション]画面の[4. フレームワーク]ステップにて、[JavaServer Faces]を選択し、「終了]を押下します。
以上で、Webアプリケーションのプロジェクト作成は完了です。

メッセージ送信処理の実装

メッセージを送信する部品として、JSFページとJSF管理対象Beanの2つを作成します。
JSFページでメッセージを入力して送信を実行したら、JSF管理対象BeanでメッセージをJMSキューに入れるという処理になります。
なお、JMSキューではメッセージ送信部品をProducerと呼びます。

メッセージ送信するJSF管理対象Beanの作成

以下の手順で、JSFページで入力したメッセージを取り出して、JMSキューに入れるJSF管理対象Beanを作成します。
なお、JSFページは後で作成します。
  1. [プロジェクト]の[ソース・パッケージ]を右クリックして、ポップアップメニューから[新規] > [その他]を実行します。
  2. [新規ファイル]画面の[1. ファイル・タイプを選択]ステップにて、
    [カテゴリ]で[JavaServer Face]を、[ファイル・タイプ]で[JSF管理対象Bean]を選択し、[次 >]を押下します。
  3. [New JSF管理対象Bean]画面の[2. 名前と場所]ステップにて、
    [クラス名]に[MessageProducerBean]、[パッケージ]に[jms2]を入力し、[スコープ]で[request]を選択し、[終了]を押下します。
  4. 以上のウィザードで生成されたjms2.MessageProducerクラスをプログラミングします。
    messageフィールドとそのgetter/setterを作成し、sendメソッドを入れます。
    (赤字がプログラミングする部分)
    package jms2;
    
    import javax.inject.Named;
    import javax.enterprise.context.RequestScoped;
    
    @Named(value = "messageProducerBean")
    @RequestScoped
    public class MessageProducerBean {
        private String message;
    
        public MessageProducerBean() {
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public void send(){
        }
    }
  5. sendメソッドの閉じかっこ「}」の後ろで[Alt]+[Insert]キーを押下して、ポップアップメニューから[JMSメッセージを送信...]を実行します。
  6. [JMSメッセージを送信]画面の、[プロジェクトの送信先]で[追加]を押下して[jms/queue1]を追加し、[OK]を押下します。
  7. jms2.MessageProducerクラスにコードが自動挿入され、次の内容になります。
    また、[サーバー・リソース]フォルダ配下の[glassfish-resources.xml]にも「jms/queue1」などが自動挿入されます。
    (赤字が自動挿入されたコード)
    package jms2;
    
    import javax.annotation.Resource;
    import javax.inject.Named;
    import javax.enterprise.context.RequestScoped;
    import javax.inject.Inject;
    import javax.jms.JMSConnectionFactory;
    import javax.jms.JMSContext;
    import javax.jms.Queue;
    
    @Named(value = "messageProducerBean")
    @RequestScoped
    public class MessageProducerBean {
        @Resource(mappedName = "jms/queue1")
        private Queue queue1;
        @Inject
        @JMSConnectionFactory("java:comp/DefaultJMSConnectionFactory")
        private JMSContext context;
        private String message;
    
        public MessageProducerBean() {
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public void send(){
        }
    
        private void sendJMSMessageToQueue1(String messageData) {
            context.createProducer().send(queue1, messageData);
        }
    }
  8. sendメソッドをプログラミングします。
    (赤字がプログラミングする部分)
        public void send(){
            FacesContext facesContext = FacesContext.getCurrentInstance();
            sendJMSMessageToQueue1(message);
            FacesMessage facesMessage = new FacesMessage("Message sent: " + message);
            facesMessage.setSeverity(FacesMessage.SEVERITY_INFO);
            facesContext.addMessage(null, facesMessage);
        }
    
  9. jms2.MessageProducerBeanクラスを保存します。
以上で、jms2.MessageProducerBeanクラスの作成は完了です。

メッセージ送信するJSFページの作成

[Webページ]フォルダ配下の[index.xhtml]を次の内容になるようにプログラミングして、保存します。
(赤字がプログラミングする部分)
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>JMS Message Producer</title>
    </h:head>
    <h:body>
        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>
    </h:body>
</html>

メッセージ受信処理の実装

メッセージを受信する部品として、MDB(Message Driven Bean)を作成します。
今回作成するのは、JMSキューからメッセージを取り出して、コンソールに出力するだけの簡単なMDBです。 なお、JMSキューではメッセージ受信部品をConsumerと呼びます。
  1. [ソース・パッケージ]の[jms2]パッケージを右クリックして、ポップアップメニューから[新規] > [その他]を実行します。
  2. [新規ファイル]画面の[1. ファイル・タイプを選択]ステップにて、
    [カテゴリ]で[エンタープライズJavaBeans]を、[ファイル・タイプ]で[メッセージ駆動型Bean]を選択し、[次 >]を押下します。
  3. [New メッセージ駆動型Bean]画面の[2. 名前と場所]ステップにて、
    [EJB名]に[MessageConsumerBean]を入力し、[次 >]を押下します。
  4. [新規ファイル]画面の[3. アクティブ化構成プロパティ]ステップでは、そのまま[終了]を押下します。
  5. jms2.MessageConsumerBeanクラスのonMessageメソッドをプログラミングします。
    (赤字がプログラミングする部分)
    @Override
    public void onMessage(Message message) {
        try {
            TextMessage tm = (TextMessage) message;
            System.out.println("Consumed message: " + tm.getText());
        } catch (JMSException ex) {
            ex.printStackTrace(System.err);
        }
    }
  6. jms2.MessageConsumerBeanクラスを保存します。

実行してみる

  1. [JMSSample]を右クリックし、ポップアップメニューから[実行]を実行します。
  2. ブラウザでJSFページが表示されます。
    [Message]に任意のメッセージを入力して[Send Message]を押下します。
  3. NetBeansのコンソールに、次が出力されていたら成功です。
以上、簡単なJMS 2.0のチュートリアルでした。
JMS 1.1までの開発経験がある方にとっては、プログラミング量がかなり減ったことがわかっていただけるでしょう。