JMS

来源:互联网 发布:fast隐藏网络 编辑:程序博客网 时间:2024/06/07 20:14
JMS

JMS(Java Message Service,Java消息服务)是一组Java应用接口,它提供创建、发送、接收、读取消息的服务。JMS API定义了一组公共的应用程序接口和相应语法,使得Java应用能够和各种消息中间件进行通信,这些消息中间件包括IBM MQ-Series、Microsoft MSMQ及纯Java的SonicMQ。通过使用JMS API,开发人员无需掌握不同消息产品的使用方法,也可以使用统一的JMS API来操纵各种消息中间件。通过使用JMS,能够最大限度地提升消息应用的可移植性。 JMS既支持点对点的消息通信,也支持发布/订阅式的消息通信.



1、介绍

在这一节中,我们将分析两个进行点对点消息接发的程序—— QSender.java 和
QReceiver.java。

我们将在一些小节中分析代码并描述每一小节的功能。

2、QSender:提示输入 JNDI 名称~

这两个示例程序都是命令行程序, 用 System.in 输入、用 System.out 输出。
QSender 类有两个方法:main(String[]) 和 send()。main(String[]) 方法只举
例说明了 QSender ,并调用了它的 send() 方法。send() 方法的第一部分提示输
入用来发送消息受管理对象的 JNDI 的名称。

   1. *import* java.io.*;   
   2. *import* javax.jms.*;   
   3. *import* javax.naming.*;   
   4.   
   5. *public* *class* QSender {   
   6.   
   7.     *public* *static* *void* main(String[] args) {   
   8.   
   9.         *new* QSender().send();   
  10.     }   
  11.   
  12.     *public* *void* send() {   
  13.   
  14.         BufferedReader reader = *new* BufferedReader(*new* InputStreamReader(System.in));
        
  15.   
  16.         *try* {   
  17.             //Prompt for JNDI names   
  18.             System.out.println("Enter QueueConnectionFactory name:");
        
  19.             String factoryName = reader.readLine();   
  20.             System.out.println("Enter Queue name:");   
  21.             String queueName = reader.readLine();   
  22.     . . .  

3、QSender查找管理对象

send() 方法的第二部分用前面输入的名字在 JNDI 中查找受管理的对象。通过举
例说明 InitialContext 对象访问 JNDI,通过调用lookup(String) 方法并传递要
获取的对象的名字来检索受管理的对象。注意, lookup(String) 方法返回的是
Object,所以必须对返回的对象进行类型强制转换。


 

   1. . . .   
   2.         //Look up administered objects   
   3.         InitialContext initContext = *new* InitialContext();   
   4.         QueueConnectionFactory factory =   
   5.             (QueueConnectionFactory) initContext.lookup(factoryName);
        
   6.         Queue queue = (Queue) initContext.lookup(queueName);   
   7.         initContext.close();   
   8.         . . .   

4、QSender:创建 JMS 对象

现在,我们已创建了发送消息所需要的 JMS 对象。注意,我们没有用 new 直接举
例说明这些对象。所有对象都是通过调用另一个对象的方法创建的。
首先,用 QueueConnectionFactory 创建 QueueConnection。然后用
QueueConnection 创建一个 QueueSession。
QueueSession 不是经过处理的(false),并且它将使用自动确认
(Session.AUTO_ACKNOWLEDGE)。
最后,创建 QueueSender 将信息发送到从 JNDI 中检索的 Queue 发送消息。

   1. . . .   
   2.         //Create JMS objects   
   3.         QueueConnection connection = factory.createQueueConnection();
        
   4.         QueueSession session =   
   5.             connection.createQueueSession(*false*, Session.AUTO_ACKNOWLEDGE);
        
   6.         QueueSender sender = session.createSender(queue);   
   7.         . . .  

5、QSender:发送消息

现在就可以发送消息了。在这一部分中,我们进入一个循环,该循环提示我们要发
送的消息的文本。如果用户输入 quit,则退出循环。

否则要在输入的文本中建立一个 TextMessage ,并用 QueueSender 发送消息,然
后返回循环的开始部分。

   1. . . .   
   2.         //Send messages   
   3.         String messageText = *null*;   
   4.         *while* (*true*) {   
   5.             System.out.println("Enter message to send or ‘quit‘:");   

   6.             messageText = reader.readLine();   
   7.             *if* ("quit".equals(messageText))   
   8.                 *break*;   
   9.             TextMessage message = session.createTextMessage(messageText);
        
  10.             sender.send(message);   
  11.         }   
  12.         . . .   

 6、QSender:退出

退出循环后,关闭 QueueConnection。关闭 QueueConnection 会自动关闭
QueueSession 和 QueueSender。

java代码

   1. . . .   
   2.         //Exit   
   3.         System.out.println("Exiting...");   
   4.         reader.close();   
   5.         connection.close();   
   6.         System.out.println("Goodbye!");   
   7.   
   8.     } *catch* (Exception e) {   
   9.         e.printStackTrace();   
  10.         System.exit(1);   
  11.     }   
  12. }   

7、QReceiver提示输入 JNDI 名称并查找受管理的对象

QReceiver 类与 QSender 类非常类似,都有一个 main(String[]) 方法,它只举
例说明 QReceiver 并调用了它的主要方法 receive()。

提示输入 JNDI 名字并查找受管理对象的代码与 QSender 中的代码完全一样。
不过,在这个类中有两处不一样的地方:
boolean stop 实例变量被用来指出程序应该退出。
QReceiver 可以实现 MessageListener 接口来异步接收消息。

   1. *import* java.io.*;   
   2. *import* javax.jms.*;   
   3. *import* javax.naming.*;   
   4.   
   5. *public* *class* QReceiver *implements* MessageListener {   
   6.   
   7.     *private* *boolean* stop = *false*;   
   8.   
   9.     *public* *static* *void* main(String[] args) {   
  10.   
  11.         *new* QReceiver().receive();   
  12.     }   
  13.   
  14.     *public* *void* receive() {   
  15.   
  16.         BufferedReader reader = *new* BufferedReader(*new* InputStreamReader(System.in));
        
  17.   
  18.         *try* {   
  19.             //Prompt for JNDI names   
  20.             System.out.println("Enter QueueConnectionFactory name:");
        
  21.             String factoryName = reader.readLine();   
  22.             System.out.println("Enter Queue name:");   
  23.             String queueName = reader.readLine();   
  24.             reader.close();   
  25.   
  26.             //Look up administered objects   
  27.             InitialContext initContext = *new* InitialContext();   
  28.             QueueConnectionFactory factory =   
  29.                 (QueueConnectionFactory) initContext.lookup(factoryName);
        
  30.             Queue queue = (Queue) initContext.lookup(queueName);   
  31.             initContext.close();   
  32.             . . .  

 

8、QReceiver:创建 JMS 对象

像在 QSender 中那样创建 QueueConnection 和 QueueSession,然后创建一个
QueueReceiver。

接着,调用 setMessageListener(),传递 QReceiver 的本地实例 this,我们将
重调它来实现 MessageListener 接口。

最后,启动 QueueConnection 来接收消息。

   1. . . .   
   2.         //Create JMS objects   
   3.         QueueConnection connection = factory.createQueueConnection();
        
   4.         QueueSession session =   
   5.             connection.createQueueSession(*false*, Session.AUTO_ACKNOWLEDGE);
        
   6.         QueueReceiver receiver = session.createReceiver(queue);   
   7.         receiver.setMessageListener(*this*);   
   8.         connection.start();   
   9.         . . .   

9、QReceiver:等待 stop 并退出

接着,程序进入一个循环,它会在 stop 变量变为 true 时退出循环。在循环中,
线程睡眠一秒钟。一旦退出循环, QueueConnection 就会退出,并且程序也会终止

   1. . . .   
   2.         //Wait for stop   
   3.         *while* (!stop) {   
   4.             Thread.sleep(1000);   
   5.         }   
   6.   
   7.         //Exit   
   8.         System.out.println("Exiting...");   
   9.         connection.close();   
  10.         System.out.println("Goodbye!");   
  11.   
  12.     } *catch* (Exception e) {   
  13.         e.printStackTrace();   
  14.         System.exit(1);   
  15.     }   
  16. }   
  17. . . .  

10、QReceiver:onMessage(Message) 方法

需要包含 QReceiver 类的 onMessage(Message) 方法,因为 QReceiver 可以实现
MessageListener 接口。

接收消息时,就调用这个方法,并将 Message 作为参数传递。

在这个实现中,我们获得了消息的文本内容,并将它打印到 System.out。然后,
检查消息是否等于 stop,如果是,则将 stop 变量设置为 true,这会使
receive() 方法中的循环终止。

 

   1.     . . .   
   2.     *public* *void* onMessage(Message message) {   
   3.   
   4.         *try* {   
   5.             String msgText = ((TextMessage) message).getText();   
   6.             System.out.println(msgText);   
   7.             *if* ("stop".equals(msgText))   
   8.                 stop = *true*;   
   9.         } *catch* (JMSException e) {   
  10.             e.printStackTrace();   
  11.             stop = *true*;   
  12.         }   
  13.     }   
  14. }   


11、源码QSender.java 的代码清单

java 代码

   1. *import* java.io.*;   
   2. *import* javax.jms.*;   
   3. *import* javax.naming.*;   
   4.   
   5. *public* *class* QSender {   
   6.   
   7.     *public* *static* *void* main(String[] args) {   
   8.   
   9.         *new* QSender().send();   
  10.     }   
  11.   
  12.     *public* *void* send() {   
  13.   
  14.         BufferedReader reader = *new* BufferedReader(*new* InputStreamReader(System.in));
        
  15.   
  16.         *try* {   
  17.             //Prompt for JNDI names   
  18.             System.out.println("Enter QueueConnectionFactory name:");
        
  19.             String factoryName = reader.readLine();   
  20.             System.out.println("Enter Queue name:");   
  21.             String queueName = reader.readLine();   
  22.   
  23.             //Look up administered objects   
  24.             InitialContext initContext = *new* InitialContext();   
  25.             QueueConnectionFactory factory =   
  26.                 (QueueConnectionFactory) initContext.lookup(factoryName);
        
  27.             Queue queue = (Queue) initContext.lookup(queueName);   
  28.             initContext.close();   
  29.   
  30.             //Create JMS objects   
  31.             QueueConnection connection = factory.createQueueConnection();
        
  32.             QueueSession session =   
  33.                 connection.createQueueSession(*false*, Session.AUTO_ACKNOWLEDGE);
        
  34.             QueueSender sender = session.createSender(queue);   
  35.   
  36.             //Send messages   
  37.             String messageText = *null*;   
  38.             *while* (*true*) {   
  39.                 System.out.println("Enter message to send or ‘quit‘:");
        
  40.                 messageText = reader.readLine();   
  41.                 *if* ("quit".equals(messageText))   
  42.                     *break*;   
  43.                 TextMessage message = session.createTextMessage(messageText);
        
  44.                 sender.send(message);   
  45.             }   
  46.   
  47.             //Exit   
  48.             System.out.println("Exiting...");   
  49.             reader.close();   
  50.             connection.close();   
  51.             System.out.println("Goodbye!");   
  52.   
  53.         } *catch* (Exception e) {   
  54.             e.printStackTrace();   
  55.             System.exit(1);   
  56.         }   
  57.     }   
  58. }   

 

12、源码QReceiver .java 的代码清单

java 代码

   1. *import* java.io.*;   
   2. *import* javax.jms.*;   
   3. *import* javax.naming.*;   
   4.   
   5. *public* *class* QReceiver *implements* MessageListener {   
   6.   
   7.     *private* *boolean* stop = *false*;   
   8.   
   9.     *public* *static* *void* main(String[] args) {   
  10.   
  11.         *new* QReceiver().receive();   
  12.     }   
  13.   
  14.     *public* *void* receive() {   
  15.   
  16.         BufferedReader reader = *new* BufferedReader(*new* InputStreamReader(System.in));
        
  17.   
  18.         *try* {   
  19.             //Prompt for JNDI names   
  20.             System.out.println("Enter QueueConnectionFactory name:");
        
  21.             String factoryName = reader.readLine();   
  22.             System.out.println("Enter Queue name:");   
  23.             String queueName = reader.readLine();   
  24.             reader.close();   
  25.   
  26.             //Look up administered objects   
  27.             InitialContext initContext = *new* InitialContext();   
  28.             QueueConnectionFactory factory =   
  29.                 (QueueConnectionFactory) initContext.lookup(factoryName);
        
  30.             Queue queue = (Queue) initContext.lookup(queueName);   
  31.             initContext.close();   
  32.   
  33.             //Create JMS objects   
  34.             QueueConnection connection = factory.createQueueConnection();
        
  35.             QueueSession session =   
  36.                 connection.createQueueSession(*false*, Session.AUTO_ACKNOWLEDGE);
        
  37.             QueueReceiver receiver = session.createReceiver(queue);   

  38.             receiver.setMessageListener(*this*);   
  39.             connection.start();   
  40.   
  41.             //Wait for stop   
  42.             *while* (!stop) {   
  43.                 Thread.sleep(1000);   
  44.             }   
  45.   
  46.             //Exit   
  47.             System.out.println("Exiting...");   
  48.             connection.close();   
  49.             System.out.println("Goodbye!");   
  50.   
  51.         } *catch* (Exception e) {   
  52.             e.printStackTrace();   
  53.             System.exit(1);   
  54.         }   
  55.     }   
  56.   
  57.     *public* *void* onMessage(Message message) {   
  58.   
  59.         *try* {   
  60.             String msgText = ((TextMessage) message).getText();   
  61.             System.out.println(msgText);   
  62.             *if* ("stop".equals(msgText))   
  63.                 stop = *true*;   
  64.         } *catch* (JMSException e) {   
  65.             e.printStackTrace();   
  66.             stop = *true*;   
  67.         }   
  68.     }   
  69. }  

0 0
原创粉丝点击