`
tonney_lee
  • 浏览: 25305 次
  • 性别: Icon_minigender_1
  • 来自: 浙江.杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

JMS 点对点接口

    博客分类:
  • Java
阅读更多
QueueConnectionFactory 是从 JNDI 中检索的受管理对象,它创建了到提供者的连接。它包含 createQueueConnection() 方法,该方法返回一个 QueueConnection 对象。

QueueConnection 封装了链接到提供者的活动连接。它的一些方法包括:

createQueueSession(boolean, int):返回一个 QueueSession 对象。boolean 参数指出 QueueSession 是否被处理,int 指出确认模式(请参阅 确认)。

start() (从 Connection 继承):激活提供者发送消息。

stop() (从 Connection 继承):临时停止发送消息,可以用 start() 重新开始发送。

close() (从 Connection 继承):关闭到提供者的链接,并释放它占有的所有资源。


QueueSession 是发送和接收 PTP 消息的单线程上下文。它的一些方法包括:

createSender(Queue):返回 QueueSender来向指定的 Queue 发送消息。


createReceiver(Queue):返回 QueueReceiver 对象来接收来自指定的 Queue 的消息。


createBrowser(Queue) (从 Session 继承):返回一个 QueueBrowser 对象来浏览指定 Queue 上的消息。


commit() (从 Session 继承):提交当前事务中所有已经使用或者产生的消息。


rollback() (从 Session 继承):回滚当前事务中所有已使用或者已产生的消息。


create<MessageType>Message(...) (从 Session 继承):返回 <MessageType>Message 的各种方法——例如 MapMessage、TextMessage 等。

Queue 封装了点对点目的地。它是一个从 JNDI 中检索的受管理对象。

QueueSender 被用来发送点对点消息。它的一些方法包括:

send(Message):发送指示的 Message。


setDeliveryMode(int) (从 MessageProducer 继承):设置后续消息发送的发送模式,有效值为 DeliveryMode.PERSISTENT 和 DeliveryMode.NON_PERSISTENT。


setPriority(int) (从 MessageProducer 继承):设置后续消息发送的优先级,有效值为 0 到 9。


setTimeToLive(long) (从 MessageProducer 继承):设置后面发送的消息失效前的持续时间,以毫秒为单位。


QueueReceiver 被用来接收点对点消息。它的一些方法包括:

receive() (从 MessageConsumer 继承):返回到达的下一个消息,这个方法会阻塞,直到下一个消息可用为止。


receive(long) (从 MessageConsumer 继承):接收在 long 毫秒内到达的下一个消息,如果在时间期限内没有消息到达,则返回 null。


receiveNoWait (从 MessageConsumer 继承):如果当前有一条消息,则接收下一条消息,如果没有消息,则返回 null。


setMessageListener(MessageListener) (从 MessageConsumer 继承):设置 MessageListener,MessageListener 对象在消息到达时接收它们,即异步方式接收消息。

用 QueueReceiver 接收消息时,在接收消息后从队列中删除她们。用 QueueBrowser 可以查看队列中的消息而不删除它们。完成这项操作的方法是 getEnumeration(),它返回一个可以用来扫描队列中消息的java.util.Enumeration,队列的变化(消息到达或失败)可能是可见的,也可能是不可见的。


例子:

QSender.java 
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();

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

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

            //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);
            }

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

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


QReceiver.java 
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();

            //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();

            //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);
        }
    }

    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;
        }
    }
}

分享到:
评论

相关推荐

    JMS中间件ActiveMQ介绍

    Java Message Service(JMS)是SUN提出的旨在统一各种MOM(Message-Oriented Middleware )系统接口的规范,它包含点对点(Point to Point,PTP)和发布/订阅(Publish/Subscribe,pub/sub)两种消息模型,提供可靠...

    JMS简明教程创建消息 -> 发送消息 -> 接收消息 -> 读取消息

    什么是消息 消息是一个用于在组件和应用程序之间通讯的的方法。...由于消息是点对点的,所以 JMS 的所有用户都称为客户端(clients)。JMS 应用由定义 消息的应用和一系列与他们交互的客户端组成。

    JMS中间件ActiveMQ详解

    JavaMessageService(JMS)是SUN提出的旨在统一各种MOM(Message-OrientedMiddleware)系统接口的规范,它包含点对点(PointtoPoint,PTP)和发布/订阅(Publish/Subscribe,pub/sub)两种消息模型,提供可靠消息...

    中文java message service

    企业消息产品(或者有时称为面向消息的中间件产品)正逐渐成为公司内操作集成的关 ...由于消息是点对点的,所以JMS 的所有用户都称为客户端(clients)。JMS 应用由定义 消息的应用和一系列与他们交互的客户端组成。

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

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

    java消息服务

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

    java面试宝典

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

    JAVA面试题

    包括点对点和广播. (3)JTA:Java Transaction API,JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可. (4)JAF: Java Action FrameWork,JAVA安全认证框架.提供一些安全控制方面的框架.让开发者...

    OSMQ-开源

    基于 Java 的发布订阅和点对点异步消息中间件框架,其接口比 JMS 简单得多。

    ActiveMQ in Action翻译笔记2011.pdf

    Java Message Service(JMS)是SUN 提出的旨在统一各种MOM 系统接口的规范, 它包含点对点(Point to Point,PTP)和发布/订阅(Publish/Subscribe,pub/sub)两种消息模型,提供可靠消息传输、事务和消息过滤等机制...

    Spring中文帮助文档

    7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动代理(autoproxy)”功能 7.9.1. ...

    Spring API

    7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动代理(autoproxy)”功能 7.9.1. ...

    单点登录源码

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

    超级有影响力霸气的Java面试题大全文档

    引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。 21、heap和stack有什么区别。  栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的...

    Spring 2.0 开发参考手册

    17.6. 对远程接口不提供自动探测 17.7. 在选择这些技术时的一些考虑 18. Enterprise Java Bean(EJB)集成 18.1. 简介 18.2. 访问EJB 18.2.1. 概念 18.2.2. 访问本地的无状态Session Bean(SLSB) 18.2.3. 访问...

    java 面试题 总结

    引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。 18、heap和stack有什么区别。 栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式...

    Java事务设计策略.

    infoq 迷你书最近阅读了InfoQ上的电子书&lt;&lt;Java Transaction Strategy&gt;&gt;之后受益匪浅, 单独花了两周时间将其翻译了一下.... X/Open XA 接口应该只被用于你想要在相同事务环境内协调多个资源(例如数据库或JMS消息)的情况.

Global site tag (gtag.js) - Google Analytics