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

JMS 公共接口

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

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

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


start():激活提供者发送消息。


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


close():关闭到提供者的连接,并释放以它的名义占用的所有资源。


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

createProducer(Destination):返回一个 MessageProducer 对象,向指定的 Destination 发送消息。


createConsumer(Destination):返回一个 MessageConsumer 对象来接收来自指定 Destination 的消息。


commit():提交当前事务的所有使用的或者产生的消息。


rollback():回滚当前事务所有使用的或者产生的消息。


create<MessageType>Message(...):一组返回 <MessageType>Message 的方法——例如,MapMessage、TextMessage 等。


Destination 封装消息的目的地。它是一个从 JNDI 检索的受管理对象。

MessageProducer 用于发送消息。它的一些方法包括:

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


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


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


setTimeToLive(long):设置后续发送消息失效前的持续时间,以毫秒计。

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

receive():返回下一发到达的消息,该方法在消息可用之前会受到阻塞。


receive(long):接收在 long 毫秒内到达的下一个消息,如果在时间限制内没有消息到达,则该方法返回 null。


receiveNoWait:如果有一个消息立即可用,则接收下一个消息,如果没有消息可用,则该方法返回 null。


setMessageListener(MessageListener):设置 MessageListener,MessageListener 对象在消息到达时接收它们,也就是异步接收(请参阅 MessageListener )。


MessageListener 是有一个单一方法——onMessage(Message)——的接口,它提供了消息的异步接收和处理。

应该通过客户机类和该类使用 setMessageListener(MessageListener) 方法传递给 MessageConsumer 对象的实例来实现这个接口。在消息到达目的地时,用 onMessage(Message) 将它传递给对象。


例子:
Sender.java
import java.io.*;
import javax.jms.*;
import javax.naming.*;

public class Sender {

    public static void main(String[] args) {

        new Sender().send();
    }

    public void send() {

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

        try {
            //Prompt for JNDI names
            System.out.println("Enter ConnectionFactory name:");
            String factoryName = reader.readLine();
            System.out.println("Enter Destination name:");
            String destinationName = reader.readLine();

            //Look up administered objects
            InitialContext initContext = new InitialContext();
            ConnectionFactory factory =
                (ConnectionFactory) initContext.lookup(factoryName);
            Destination destination = (Destination) initContext.lookup(destinationName);
            initContext.close();

            //Create JMS objects
            Connection connection = factory.createConnection();
            Session session =
                connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer sender = session.createProducer(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);
        }
    }
}



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

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

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

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



Receiver.java 

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

public class Receiver implements MessageListener {

    private boolean stop = false;

    public static void main(String[] args) {

        new Receiver().receive();
    }

    public void receive() {

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

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

            //Look up administered objects
            InitialContext initContext = new InitialContext();
            ConnectionFactory factory =
                (ConnectionFactory) initContext.lookup(factoryName);
            Destination destination = (Destination) initContext.lookup(destinationName);
            initContext.close();

            //Create JMS objects
            Connection connection = factory.createConnection();
            Session session =
                connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageConsumer receiver = session.createConsumer(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;
        }
    }
}


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

Receiver 实现了 MessageListener 接口,为了异步接收消息
分享到:
评论
1 楼 mingxiao2010 2007-08-07  
很好,谢谢!

相关推荐

    JMS中间件ActiveMQ介绍

    #### JMS 公共接口 - **JMSConnection**:创建连接。 - **JMSSession**:生产和消费消息的上下文。 - **MessageProducer**:创建并发送消息。 - **MessageConsumer**:接收消息。 - **Message**:消息实体。 - **...

    JMS远程调用

    2. **定义接口**:定义一个公共接口,比如`CheckingAccountService`,其中包含需要远程调用的方法。这个接口将在客户端和服务端都需引用。 3. **实现接口**:在服务端,我们需要实现这个接口,例如`...

    JMS规范1.1

    JMS规范还定义了公共工具,比如连接工厂(ConnectionFactory)、目的地(Destination)和连接(Connection)。连接工厂用于创建JMS连接,目的地代表消息的发送和接收位置,连接则提供客户端与消息服务之间的通信通道...

    Spring JMS

    JMS 模板类提供了执行公共操作的 helper 方法,在需要更复杂应用的情况下,类把处理任务的核心委托给用户实现的回调接口。 Spring JMS 还提供了转换 JMSException 的功能,转换代码把检测到的 JMSException 层次...

    JMS1.1规范中文版

    **JMS公共工具**提供了构建JMS应用所需的基础设施。 - **受管理的对象**:如`Destination`、`ConnectionFactory`等,用于创建和管理JMS资源。 - **Connection**:表示与消息中间件的连接,是JMS应用的核心对象。 - ...

    jms specification

    - **分发实现**: 您可以向第三方分发规范的实现以供测试和评估使用,条件是此类实现不得修改、子集、超集或其他方式扩展许可方命名空间,或包含该命名空间内的公共或受保护包、类、Java接口、字段或方法,除非这些...

    JMS消息服务详解

    Java消息服务(JMS)是Java平台上的一个标准API,它定义了一套通用接口,用于与多种消息服务器进行交互。JMS提供了一种统一的访问方式,类似于JDBC和JNDI,使得开发者可以使用相同的API来访问IBM的MQSeries和JBossMQ...

    用JMS手工实现私聊和公聊

    JMS是Java平台中用于在分布式环境中传递消息的标准接口,常用于企业级应用中的异步通信。 首先,我们要理解JMS的基本概念。JMS提供两种消息模型:点对点(Point-to-Point,P2P)和发布/订阅(Publish/Subscribe,...

    JNDI,JTA和JMS简介

    JMS是一种通用的消息传递系统,提供了发送和接收消息的通用接口,让不同的消息服务提供商能够以相同的方式进行操作。 JMS的核心组件包括消息生产者(Message Producer)、消息消费者(Message Consumer)和消息队列...

    wmq.jmsra-7.0.1.3.rar

    这个资源适配器允许应用程序在Wildfly(一种流行的Java应用服务器)上与WebSphere MQ消息中间件进行交互,实现JMS接口的特性,如发布/订阅、队列、事务等。 描述中提到的“wildfly standalone deployments”意味着...

    SOA架构十大设计原则

    例如,在一个典型的SOA环境中,一个服务可能通过WSDL发布其公共接口,这个接口将描述该服务能够提供的功能、接受的数据格式以及返回的结果类型等信息。同时,服务的内部实现可以是任何技术栈下的代码实现,甚至可以...

    基于JavaEE的公共自行车租赁管理系统_JSP网站设计_SqlServer数据库设计.rar

    10. **文档与接口**:良好的文档是项目成功的关键,包括需求文档、设计文档、API接口文档等,有助于团队理解和维护系统。 综上所述,这个基于JavaEE的公共自行车租赁管理系统涵盖了Web开发的多个层面,从前端用户...

    Java消息服务中文版

    Java消息服务(Java Message Service,JMS)是一组Java应用程序接口(Java API),它提供...由Sun公司和它的合作伙伴设计的JMS API定义了一组公共的应用程序接口和相应语法,使得Java程序能够和其他消息组件进行通信。

    ActiveMQ in Action

    JMS提供了一组公共的接口和行为,使得开发者可以在不同消息代理之间切换而不必重写代码。 3. 消息中间件:介绍了消息中间件的概念,它是支持系统间异步通信的一类软件,使得分布式系统能够通过消息传递进行通信和...

    EJB基础入门与总结

    客户端通过Bean的公共接口进行操作。实现类(Bean类)在运行时实例化,成为分布式对象。Bean分为三种类型: - SessionBean:处理客户端请求,通常用于短期、状态化的交互。 - EntityBean:代表持久性的商业实体,与...

    用 Web 服务和 J2EE 集成企业应用程序

    例如,通过使用基于Web服务的公共接口,开发人员可以更容易地将后端系统集成到J2EE环境中,支持更高级别的自动化,并促进后端系统的互相连接。 #### 参考资料 为了更深入地理解本文涉及的概念和技术,以下是一些...

    中间件课件(COM,CORABA,EJB)

    EJB有三种主要类型:会话bean(Session Beans)处理业务逻辑,实体bean(Entity Beans)表示持久化数据,消息驱动bean(Message-Driven Beans)用于接收和处理JMS消息。学习EJB需要理解容器管理的生命周期、ejb-jar....

Global site tag (gtag.js) - Google Analytics