ポイントツーポイントのプログラミング

ポイントツーポイントメッセージングは、キューベースのメカニズムです。メッセージは特定のキューに送られます。センダーはメッセージをキューに追加し、レシーバーはキューからメッセージを抽出します。

ポイントツーポイントメッセージングソリューションを実装する場合は、次のコードを作成します。

ポイントツーポイントセンダーのコーディング

センダーは次のオブジェクトを使用してメッセージをキューに追加します。

センダークラスは、javax.jms クラスのいずれも拡張しません。このクラスは明示的に他のクラスを拡張したり、暗黙的に java.lang.Object を拡張したりできます。

次のコードを実行するには、 queue1 と名付けたキューを JMC 内に定義する必要があります。

センダーのコードを作成するには

  1. 次のパッケージをインポートします。
    import java.util.*;
    import javax.jms.*;
    import javax.naming.*;
    
  2. 次のように、JMS で使用されるオブジェクトの変数を宣言します。
    private Context _context = null;
    private QueueConnection _connection = null;
    private QueueSession _session = null;
    private TextMessage _message = null;
    private QueueSender _sender = null;
    
  3. アプリケーション特有のメソッドを使用して、ユーザーとキューの情報を取得します。わかりやすくするために、この例では各値をハードコーディングしています。
    // ユーザー ID とパスワード
    private String _user = new String("admin");
    private String _passwprd = new String("admin");
    // キューの名前を JMC 全体で一致させます。
    // この情報は、SERVER-INF/jrun-resources.xml ファイルでも表示できます。
     
    private String _queue = new String("queue1");
    // これは、ホスト名と JNDI ポート番号を連結したものです。
    private String _providerurl = new String("localhost:2918");
    private String _ctxtFactory = new String 
    ("jrun.naming.JRunContextFactory");
    
  4. メッセージを送信する前に、JMS 変数を作成して、値を挿入します。
    // JNDI を使用して設定します。
    try {
      Properties p = new Properties();
      p.put(Context.SECURITY_PRINCIPAL, _user);
      p.put(Context.SECURITY_CREDENTIALS, _password);
      p.put(Context.PROVIDER_URL, _providerurl );
      p.put( Context.INITIAL_CONTEXT_FACTORY, ctxtFactory);
    
      // 同じサーバ上のコンテキストにアクセスする場合は、
      // これは空のコンストラクタでも構いません。
      _context = new InitialContext(p);
    // JNDI から QueueConnectionFactory を取得します。
        log("just before QueueConnectionFactory context lookup");
    
      final QueueConnectionFactory factory =
        (QueueConnectionFactory)_context.lookup
          ("jms/QueueConnectionFactory");
      // ファクトリを使用して、QueueConnection (anonymous) を作成します。
      _connection = factory.createQueueConnection();
      // QueueConnection を使用して QueueSession を作成します。
      _session = _connection.createQueueSession(false,
      Session.AUTO_ACKNOWLEDGE);
      // QueueSession を使用して QueueSender を作成します。
      // queue1 を探します。
      log("just before createSender"); 
      _sender = _session.createSender((Queue)_context.lookup
        ("jms/queue/queue1"));
      // TextMessage オブジェクトを作成します。
      _message = _session.createTextMessage();
      }
      catch(NamingException e) {
        System.out.println("Naming Exception:" + e.getMessage());
      }
      catch(JMSException e) {
        System.out.println("JMS Exception:" + e.getMessage());
      }
    
  5. メッセージを送信します。このサーブレット例では、フォームフィールドからメッセージを取得します。
    int priority = Message.DEFAULT_PRIORITY;
    int delivery = Message.DEFAULT_DELIVERY_MODE;
    
    String text = new String("Blank Message");
    
    String[] attrArray = req.getParameterValues("thisMessage");
    // 呼び出しフォームには、thisMessage 用の値が 1 つしかないと想定します。
    if(attrArray != null) {
      text = attrArray[0];
    }
    try {
      _message.setText(text);
      // キューに送信します。メッセージは 5 分間存続します。
      _sender.send(_message, delivery, priority, 5 * 60 * 1000);
    }
    catch(JMSException e) {
      System.out.println("JMS Exception:" + e.getMessage());
    }
    
  6. 完了したら、JMS オブジェクトを閉じます。
    // これらは if != null のチェックでラップしたほうがよいでしょう。
    try {
      _sender.close();
      _session.close();
      _connection.close();
      _context.close();
      }
      catch(NamingException e) {
        System.out.println("Naming exception in destroy: " +
          e.getMessage());
      }
      catch(JMSException e) {
        System.out.println("JMS Exception:" + e.getMessage());
      }
    

ポイントツーポイントレシーバーのコーディング

レシーバーは、次のオブジェクトを使用してキューからメッセージを取り出します。

レシーバーが非同期メッセージを使用する場合は、MessageListener インターフェイスと onMessage メソッドを実装する必要があります。レシーバークラスは、javax.jms クラスのいずれも拡張しませんが、このクラスは明示的に他のクラスを拡張したり、暗黙的に java.lang.Object を拡張したりできます。

メッセージ駆動型 bean スタイルメッセージレシーバーについては、 「メッセージ駆動型 bean」 を参照してください。

レシーバーのコードを作成するには

  1. 次のパッケージをインポートします。
    import java.util.*;
    import javax.jms.*;
    import javax.naming.*;
    
  2. 次のように、JMS で使用されるオブジェクトの変数を宣言します。
    private Context _context = null;
    private QueueConnection _connection = null;
    private QueueSession _session = null;
    private TextMessage _message = null;
    private QueueSender _sender = null;
    private QueueReceiver _receiver = null;
    
  3. メッセージを受信する前に、JMS 変数を作成して、値を挿入します。
    try {
      String providerurl="localhost:2918";
      Properties env = new Properties();
      env.put(Context.PROVIDER_URL, providerurl );
      env.put( Context.INITIAL_CONTEXT_FACTORY, 
    "jrun.naming.JRunContextFactory" );
      _context = new InitialContext(env);
    
      // JNDI から QueueConnectionFactory を取得します。
      final QueueConnectionFactory factory = 
        (QueueConnectionFactory)_context.lookup
          ("java:comp/env/jms/QueueConnectionFactory");
      // ファクトリを使用して QueueConnection を作成します。
      _connection = factory.createQueueConnection();
      // QueueConnection を使用して QueueSession を作成します。
      _session = _connection.createQueueSession(false,
        Session.AUTO_ACKNOWLEDGE);
      // QueueSession を使用して QueueReceiver を作成します。
      // queue1 を探します。
      _receiver = _session.createReceiver((Queue)_context.lookup
          ("jms/queue/queue1"));
      // TextMessage オブジェクトを作成します。
      _message = _session.createTextMessage();
    }
    catch(NamingException e) {
      System.out.println("Naming Exception:" + e.getMessage());
    }
    catch(JMSException e) {
      System.out.println("JMS Exception:" + e.getMessage());
    }
    
  4. キューからメッセージを取り出す onMessage メソッドをコーディングします。
    ...
    public void onMessage(Message message) {
      try {
        TextMessage textMessage = (TextMessage) message;
        String text = textMessage.getText();
        System.out.println(text);
      } catch(JMSException jmse){ jmse.printStackTrace(); }
    }
    ...