您现在的位置是:首页-> 米鼠技术 ->使用JMS队列

使用JMS队列

Java消息发送服务(Java Messaging Service,JMS)是提供商无关的一套API,用于在程序间进行可靠的消息发送。在客户端-服务器计算中,客户端程序与服务器与服务器建立联系并请求服务。相反,消息发送应用在相互协作的程序之间发送消息。有些程序(在所谓的“对等(peer-to-peer)”应用中)则相互之间直接交换信息(JXTA使用的就是这种模型)。


现在可以用QueueSender来发送消息到队列。

4. 创建一个消息对象(Message的子类),然后使用QueueSender的发送方法将它们发送至目的地。示例程序从Session中获得一个TextMessage对象。接着示例程序将每个程序参数打包到TextMessage 中,然后使用QueueSender将其发送至队列。注意,同一个TextMessage 可以使用多次。

  1.       TextMessage tm = qs.createTextMessage();
  2.        
  3.       // 为第一个参数之后的每个参数进行一次循环
  4.       // 以文本消息的形式发送参数字符串
  5.       for (int i = 2; i < args.length; i++) {
  6.           tm.setText(args[i]);
  7.           qsnd.send;
  8.       }


5.关闭QueueConnection。在try/finally程序块的最后一条语句中关闭连接是一个好习惯。这一步很重要:忘记关闭 QueueConnections 将可能导致服务器上的资源泄漏: 

  1.   } finally {
  2.           if (qc != null) {
  3.               qc.close();
  4.           }
  5.       }



要发送消息到一个消息队列,可以使用TestQueue程序(在缺省的包中),加上一个参数“send”,例如:

$ java TestQueue send jms/queue/MyTestQueue a b c d
Java Message Service 1.0.2 Reference 
Implementation (build b14)
Sent: 'a'
Sent: 'b'
Sent: 'c'
Sent: 'd'

接收消息


TestQueue程序按照以下步骤接收消息:

和2从一个消息队列接收消息的起先两步与发送消息是一样的:先是查找连接工厂,再获得一个QueueConnection,然后查找Queue。 
从QueueSession 获得一个QueueReceiver :
QueueReceiver qrcv = qs.createReceiver(q); 
3.    从Queue接收消息。示例程序进入一个循环,在这个循环中从队列获取消息并将它们打印到标准输出设备。 

  1.          qc.start();
  2.          Message m = qrcv.receive(10000);
  3.          while (m != null) {
  4.              if (m instanceof TextMessage) {
  5.                  TextMessage tm = (TextMessage)m;
  6.               System.out.println("Received text: '" +
  7.                                  tm.getText() + "'");
  8.           } else {
  9.               System.out.println("Received a " +
  10.                               m.getClass().getName());
  11.           }
  12.           m = qrcv.receive(100);
  13.       } finally {
  14.          if (qc != null) {
  15.              qc.close();
  16.           }
  17.       }


对QueueConnection的启动方法的调用将告诉连接开始接收消息。QueueReceiver接收方法带有一个参数,该参数表明了等待一条消息的毫秒数。如果消息没有在规定时间内到达,该方法将返回null值。直到消息队列在100毫秒的时间内都保持为空,程序才开始读取和打印收到的消息。在try/finally程序块的结尾有一个finally子句,该子句像前面例子中一样地关闭QueueConnection。

要接收消息队列中的消息,可以使用TestQueue程序,再带上一个参数“recy”,例如:

$ java TestQueue recv jms/queue/MyTestQueue
Java Message Service 1.0.2 Reference 
Implementation (build b14)
Received text: 'a'
Received text: 'b'
Received text: 'c'
Received text: 'd'

配置服务器


如果你使用的不是参考引用,或者你想更改队列和/或队列连接工厂的名字,你就需要通过使用平台的管理工具配置JMS提供者。队列或者连接工厂被创建之后,便留在服务器中,直到服务器重新启动。有些平台实现可能会为客户端提供扩展API,以便程序化地创建目的地和连接工厂。 

用来在J2EE SDK下创建受管理的对象的工具是。要配置服务器,需: 

启动应用服务器。 
Create a message queue, giving it a JNDI name. (Do this only once.) To create a 
new message queue in the J2EE SDK, first decide on a name for your message 
queue. It can be convenient for administration purposes to choose a name that 
indicates that the queue is used by JMS, for example, jms/MyTestQueue. Then 
execute the command:创建一个消息队列,并为它取一个JNDI名。(只做一次。)要用J2EE SDK创建一个新的消息队列,首先需要为消息队列决定一个名字。为了便于管理, 应该选择一个可以表明该队列是JMS使用的队列,例如jms/MyTestQueue。然后执行命令: 
             j2eeadmin -addJmsDestination  queue

用消息队列的实际名字替换 。

由于连接工厂名QueueConnectionFactory被硬性地放在示例程序中,因此要告诉程序使用一个不同的连接工厂名,就必须修改源代码,并且重新编译。例如,在TestQueue.java中: 

  1.         // Change this variable's value to change the 
  2.        // connection factory name
  3.        protected static String qfactoryName =
  4.                           "QueueConnectionFactory"



重新编译之后,使用j2eeadmin(或者你自己的服务器的工具)创建一个connection factory,给它取个JNDI名,如:

j2eeadmin -addJmsFactory jms/MyQueueConnectionFactory

要列出连接工厂,使用: 

j2eeadmin -listJmsFactory

要列出目的地,使用: 

j2eeadmin -listJmsDestination

对于不是J2EE SDK的平台,可以在该平台上使用J2EE产品的部署工具来创建所需的消息队列和连接工厂。

运行示例代码


下载这些期的示例存档。这个JAR文件包含了示例程序的完整源代码,包括Java程序文件和HTML格式的文件。你可以使用命令jar xvf ttmar2003.jar 将示例jar中的内容解压缩到你的工作目录下。在运行示例程序前,要确保J2EE服务器正在运行。 

多次运行示例程序。试着发送一些成批的消息,但是不接收这些消息,检查一下输出的顺序。 

这个示例程序为你试着使用JMS队列提供了切入点。探索一下JMS接口使用的API。例如,可以更改一下程序,试着使用三种不同的接收方式。探索一下事务性的消息发送,或者试着发送各种类型的消息对象。JMS有许多特性,熟练使用它可以提高你的应用设计水平。 


热点文章
最新项目
相关文章 最新文章