ポイントツーポイントメッセージングは、キューベースのメカニズムです。メッセージは特定のキューに送られます。センダーはメッセージをキューに追加し、レシーバーはキューからメッセージを抽出します。
ポイントツーポイントメッセージングソリューションを実装する場合は、次のコードを作成します。
センダーは次のオブジェクトを使用してメッセージをキューに追加します。
javax.naming.Context
javax.jms.QueueConnectionFactory
javax.jms.QueueConnection
javax.jms.QueueSession
javax.jms.QueueSender
javax.jms.Message
センダークラスは、javax.jms
クラスのいずれも拡張しません。このクラスは明示的に他のクラスを拡張したり、暗黙的に java.lang.Object
を拡張したりできます。
次のコードを実行するには、 queue1 と名付けたキューを JMC 内に定義する必要があります。
import java.util.*; import javax.jms.*; import javax.naming.*;
private Context _context = null; private QueueConnection _connection = null; private QueueSession _session = null; private TextMessage _message = null; private QueueSender _sender = null;
// ユーザー 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");
// 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()); }
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()); }
// これらは 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()); }
レシーバーは、次のオブジェクトを使用してキューからメッセージを取り出します。
javax.naming.Context
javax.jms.QueueConnectionFactory
javax.jms.QueueConnection
javax.jms.QueueSession
javax.jms.QueueReceiver
javax.jms.Message
レシーバーが非同期メッセージを使用する場合は、MessageListener
インターフェイスと onMessage
メソッドを実装する必要があります。レシーバークラスは、javax.jms
クラスのいずれも拡張しませんが、このクラスは明示的に他のクラスを拡張したり、暗黙的に java.lang.Object
を拡張したりできます。
メッセージ駆動型 bean スタイルメッセージレシーバーについては、 「メッセージ駆動型 bean」 を参照してください。
import java.util.*; import javax.jms.*; import javax.naming.*;
private Context _context = null; private QueueConnection _connection = null; private QueueSession _session = null; private TextMessage _message = null; private QueueSender _sender = null; private QueueReceiver _receiver = null;
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()); }
onMessage
メソッドをコーディングします。... public void onMessage(Message message) { try { TextMessage textMessage = (TextMessage) message; String text = textMessage.getText(); System.out.println(text); } catch(JMSException jmse){ jmse.printStackTrace(); } } ...