`

JMS点对点编程

    博客分类:
  • java
阅读更多
介绍 第 1 页(共10 页)

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

我们将在一些小节中分析代码并描述每一小节的功能。可以在附录中查看完整的小节清单:QSender.java 的代码清单 和 QReceiver.java 的代码清单。

QSender:提示输入 JNDI 名称 第 2 页(共10 页)




这两个示例程序都是命令行程序, 用 System.in 输入、用 System.out 输出。

QSender 类有两个方法:main(String[]) 和 send()。main(String[]) 方法只举例说明了 QSender ,并调用了它的 send() 方法。

send() 方法的第一部分提示输入用来发送消息受管理对象的 JNDI 的名称。



import java.io.*;
import javax.jms.*;
import javax.naming.*;

public class QSender {

    public static void main(String[] args) {

        new QSender().send();
    }

    public void send() {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        try {
            //Prompt for JNDI names
            System.out.println("Enter QueueConnectionFactory name:");
            String factoryName = reader.readLine();
            System.out.println("Enter Queue name:");
            String queueName = reader.readLine();
    . . .


QSender查找管理对象 第 3 页(共10 页)




send() 方法的第二部分用前面输入的名字在 JNDI 中查找受管理的对象。

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



    . . .
            //Look up administered objects
            InitialContext initContext = new InitialContext();
            QueueConnectionFactory factory =
                (QueueConnectionFactory) initContext.lookup(factoryName);
            Queue queue = (Queue) initContext.lookup(queueName);
            initContext.close();
            . . .

QSender:创建 JMS 对象 第 4 页(共10 页)




现在,我们已创建了发送消息所需要的 JMS 对象。注意,我们没有用 new 直接举例说明这些对象。所有对象都是通过调用另一个对象的方法创建的。

首先,用 QueueConnectionFactory 创建 QueueConnection。然后用 QueueConnection 创建一个 QueueSession。

QueueSession 不是经过处理的(false),并且它将使用自动确认 (Session.AUTO_ACKNOWLEDGE)。

最后,创建 QueueSender 将信息发送到从 JNDI 中检索的 Queue 发送消息。



    . . .
            //Create JMS objects
            QueueConnection connection = factory.createQueueConnection();
            QueueSession session =
                connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            QueueSender sender = session.createSender(queue);
            . . .


QSender:发送消息 第 5 页(共10 页)




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

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



    . . .
            //Send messages
            String messageText = null;
            while (true) {
                System.out.println("Enter message to send or 'quit':");
                messageText = reader.readLine();
                if ("quit".equals(messageText))
                    break;
                TextMessage message = session.createTextMessage(messageText);
                sender.send(message);
            }
            . . .

QSender:退出 第 6 页(共10 页)




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



    . . .
            //Exit
            System.out.println("Exiting...");
            reader.close();
            connection.close();
            System.out.println("Goodbye!");

        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}


QReceiver提示输入 JNDI 名称并查找受管理的对象 第 7 页(共10 页)




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

提示输入 JNDI 名字并查找受管理对象的代码与 QSender 中的代码完全一样。

不过,在这个类中有两处不一样的地方:

boolean stop 实例变量被用来指出程序应该退出。


QReceiver 可以实现 MessageListener 接口来异步接收消息。



import java.io.*;
import javax.jms.*;
import javax.naming.*;

public class QReceiver implements MessageListener {

    private boolean stop = false;

    public static void main(String[] args) {

        new QReceiver().receive();
    }

    public void receive() {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        try {
            //Prompt for JNDI names
            System.out.println("Enter QueueConnectionFactory name:");
            String factoryName = reader.readLine();
            System.out.println("Enter Queue name:");
            String queueName = reader.readLine();
            reader.close();

            //Look up administered objects
            InitialContext initContext = new InitialContext();
            QueueConnectionFactory factory =
                (QueueConnectionFactory) initContext.lookup(factoryName);
            Queue queue = (Queue) initContext.lookup(queueName);
            initContext.close();
            . . .


QReceiver:创建 JMS 对象 第 8 页(共10 页)




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

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

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



    . . .
            //Create JMS objects
            QueueConnection connection = factory.createQueueConnection();
            QueueSession session =
                connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            QueueReceiver receiver = session.createReceiver(queue);
            receiver.setMessageListener(this);
            connection.start();
            . . .


QReceiver:等待 stop 并退出 第 9 页(共10 页)




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



    . . .
            //Wait for stop
            while (!stop) {
                Thread.sleep(1000);
            }

            //Exit
            System.out.println("Exiting...");
            connection.close();
            System.out.println("Goodbye!");

        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
    . . .

QReceiver:onMessage(Message) 方法 第 10 页(共10 页)




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

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

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



    . . .
    public void onMessage(Message message) {

        try {
            String msgText = ((TextMessage) message).getText();
            System.out.println(msgText);
            if ("stop".equals(msgText))
                stop = true;
        } catch (JMSException e) {
            e.printStackTrace();
            stop = true;
        }
    }
}

分享到:
评论

相关推荐

    java weblogic jms temple

    自己写好的一个简单的weblogic jms的简单实现,包括点对点的实现,以及topic的实现,适合初学者参考

    《Java消息服务(第二版)》电子书

    通过对支持点对点和发布/订阅“消息传送”的标准API的完全解读及具体实例,介绍了如何利用“厂商无关”的JMS来解决许多体系结构面临的挑战。本书适用于掌握Java语言并有业务解决方案开发经验的读者,或者需要学习...

    java消息服务

    通过对支持点对点和发布/订阅“消息传送”的标准api的完全解读及具体实例,介绍了如何利用“厂商无关”的jms来解决许多体系结构面临的挑战。本书适用于掌握java语言并有业务解决方案开发经验的读者,或者需要学习...

    Java数据编程指南

    Java数据库连接(JDBC) 什么是JDBC JDBC结构 开始起步 使用JDBC 一个简单的范例 对映Java与SQL类型 处理SQL错误 ResultSet与数据库元数据 JDBC中的事务处理 一个JDBC事务范例 ...

    Java事务设计策略.

    编程式事务模式, 编程管理JTA事务 声明式事务模式, 以方法为单位,让容器使用配置信息来进行事务管理 最佳实践: 当为方法分配事务属性的时候,把类中对大部分方法最具限制性的属性作为类级别的默认属性, 然后再...

    jsmSpecification.rar_Java编程_Java_

    jms 规范,知识面全,介绍详细,深入,对比较流行的知识点都做了很详细的分析。

    Spring2.0宝典 源码

    内容涵盖了Spring的核心机制、依赖注入、资源访问、AOP框架、事务框架、整合Hibernate、DAO支持、JDBC支持、MVC框架、整合第三方表现层技术、...、EJB访问和实现、Spring对测试的简化、Spring对JMS和Java Mall的支持等...

    2小时学会Spring+Dubbo整合ActiveMQ消息队列

    在职开发人员学完后会让你的薪资更高,让你更了解互联网是如何解决高并发 学完SSM框架的同学就可以学习,能让你切身感受到企业级开发环境目标1:理解消息中间件、JMS等概念目标2:掌握JMS点对点与发布订阅模式的收发...

    从Java走向Java+EE+.rar

    18.3.1 一个简单的点对点模式消息实例 273 18.3.2 一个简单的发布者/订阅者模式消息实例 279 18.4 小结 285 第19章 利用JXTA编写P2P应用 286 19.1 P2P模型 286 19.2 JXTA框架 288 19.3 实例——JXTA开发...

    Spring中文帮助文档

    2.4.4. 异步的JMS 2.4.5. JDBC 2.5. Web层 2.5.1. Spring MVC合理的默认值 2.5.2. Portlet 框架 2.5.3. 基于Annotation的控制器 2.5.4. Spring MVC的表单标签库 2.5.5. 对Tiles 2 支持 2.5.6. 对JSF 1.2支持...

    Spring API

    2.4.4. 异步的JMS 2.4.5. JDBC 2.5. Web层 2.5.1. Spring MVC合理的默认值 2.5.2. Portlet 框架 2.5.3. 基于Annotation的控制器 2.5.4. Spring MVC的表单标签库 2.5.5. 对Tiles 2 支持 2.5.6. 对JSF 1.2支持...

    spring4.1核心包

    提供的对AspectJ框架的整合,也是A面向切面编程。 AspectJ可用于基于普通Java对象的模块化 注意:aop 和 aspects区别: http://www.oschina.net/translate/comparative_analysis_between_spring_aop_and_aspectj。...

    Spring 2.0 开发参考手册

    2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. ...

    spring chm文档

    Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack ...19.2. 使用Spring JMS ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. 动态语言支持 2.6.2. JMX 2.6 .3. 任务规划 2.6.4. 对Java 5...

    单点登录源码

    单点登录, SSM框架公共模块 ├── zheng-admin -- 后台管理模板 ├── zheng-ui -- 前台thymeleaf模板[端口:1000] ├── zheng-config -- 配置中心[端口:1001] ├── zheng-upms -- 用户权限管理系统 | ├── ...

    java面试宝典

    160、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 38 161、AJAX的全称是什么? 介绍一下AJAX 38 162、Ajax主要包含了哪些技术? 38 163、主要的Ajax框架都有什么? 38 164、介绍一下XMLHttpRequest...

    Fourinone分布式并行计算四合一框架

     Fourinone2.0提供了一个4合1分布式框架和简单易用的编程api,实现对多台计算机cpu,内存,硬盘的统一利用,从而获取到强大计算能力去解决复杂问题。Fourinone框架提供了一系列并行计算模式(农民工/包工头/职介绍/...

    Fourinone分布式计算框架

    首先,对分布式协同方面,它实现了Zookeeper所有的功能,并且做了很多改进,包括简化Zookeeper的树型结构,用domain/node两层结构取代,简化Watch回调多线程等待编程模型,用更直观的容易保证业务逻辑完整性的内容...

Global site tag (gtag.js) - Google Analytics