`
JFires
  • 浏览: 43000 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

2.5使用JMS API创建JMS应用(一)

阅读更多

2.5使用JMS API创建JMS应用

    因不同的商业要求,创建一个JMS应用可以很简单也可以很复杂。就像JDBC,JNDI,EJBs等API,抽象JMS API,使得JMS代码和商业逻辑相分离是必须的。这个概念不会在这里讨论,因为这要涉及到模式和应用架构,不是一两句话可以说完的。下面是一些简单的例子,它们向你展示了一个最基本的JMS APIs的使用,

 

2.5.1 一个简单的JMS应用

   一个JMS应用使用Java语言编写的,它组合了各个部分来和JMS一起工作。这些部分在2.3节已经讨论过。一个简单的JMS应用会下面的步骤:

  1. 请求一个JMS连接工i厂。
  2. 是用连接工厂创建连接。
  3. 启动JMS连接。
  4. 通过连接创建session。
  5. 获取一个目标。
  6. 创建一个生产者,或a.创建一个生产者,b.创建一条JMS消息并发送到目标
  7. 创建一个消费者,或a.创建一个消费者,b.注册一个消息监听器。
  8. 发送或接受消息。
  9. 关闭所有资源(连接,会话,生产者,消费者等)。

    这些步骤是用来展示使用JMS的一个简单流程。下面的列表用来展现创建一个生产者并发送消息的代码。

Listing 2.8 Sending a JMS message

public class MyMessageProducer {
...
    ConnectionFactory connectionFactory;
    Connection connection;
    Session session;
    Destination destination;
    MessageProducer producer;
    Message message;
    boolean useTransaction = false;
    try {
        Context ctx = new InitialContext();
        connectionFactory =
            (ConnectionFactory) ctx.lookup("ConnectionFactoryName");
        connection = connectionFactory.createConnection();
        connection.start();
        session = connection.createSession(useTransaction,
            Session.AUTO_ACKNOWLEDGE);
        destination = session.createQueue("TEST.QUEUE");
        producer = session.createProducer(destination);
        message = session.createTextMessage("this is a test");
        producer.send(message);
    } catch (JMSException jmsEx) {

        ...
    } finally {
         producer.close();
         session.close();
         connection.close();
    }
}

    列表2.8,首先创建了一个上下文。通常情况下,上下文是通过JNDI路径获取的,这个例子只是用来演示的。在初始化的上下文中通过使用连接工厂的唯一名字获取它。通过连接工厂,JMS连接被创建和启动。这之后,JMS客户端可以开始和代理器交互了。通过JMS连接,JMS会话被创建并且使用自动答复消息类型。JMS队列通过会话被创建。接下来是使用会话和目标创建生产者。之后通过会话创建了一条简单的文本消息并由生产者发送出去。最后的一个步骤是关闭所有用到的对象。

    2.8的例子演示了一个最简单的创建生产者和发送一条消息到目标的动作。注意,有没有一个消费者在等待这样一条消息对于生产者是不重要的。MOMs作用就是生产者和消费者的一个中间调节,这对于创建JMS应用非常有帮助。开发者并不需要考虑如何获取这样的中间调节功能,JMS APIs已经提供了。下面的例子则是演示一个创建消费者和接收消息的动作。

Listing 2.9 Receiving a JMS message synchronously

public class MySyncMessageConsumer {
...
    ConnectionFactory connectionFactory;
    Connection connection;
    Session session;
    Destination destination;
    MessageConsumer consumer;
    Message message;
    boolean useTransaction = false;
    try {
        Context ctx = new InitialContext();
        connectionFactory =
            (ConnectionFactory) ctx.lookup("ConnectionFactoryName");
        connection = connectionFactory.createConnection();
        connection.start();
        session = connection.createSession(useTransaction,
            Session.AUTO_ACKNOWLEDGE);
        destination = session.createQueue("TEST.QUEUE");
        consumer = session.createConsumer(destination);
        message = (TextMessage) consumer.receive(1000);
        System.out.println("Received message: " + message);

    } catch (JMSException jmsEx) {
        ...
    } finally {
        producer.close();
        session.close();
        connection.close();
    }
}

2.9的例子和2.8很像,因为它们都需要相同的步骤直到消费者被创建。之后,消费者被用来从目标接受消息。最后一部分代码是关闭所有的对象。同样地,这并不要求现在有一个生产者在发送消息。所有的中间和临时存储都是JMS提供者做的。2.9演示的是同步的消息接收。这意味着JMS消费者发送一个请求到JMS提供者,并等待响应。消费者必须通过循环一次次地获取消息。JMS消费者并非只能通过同步方法获取消息。

    JMS API同样提供了异步获取消息的方法。JMS提供者会将消息推送到消费者。下面是一个异步消息消费的例子。

Listing 2.10 Receiving a JMS message asynchronously

public class MyAsyncMessageConsumer implements MessageListener {
...
    ConnectionFactory connectionFactory;
    Connection connection;
    Session session;
    Destination destination;
    MessageProducer producer;
    Message message;
    boolean useTransaction = false;
    try {
        Context ctx = new InitialContext();
        connectionFactory =
            (ConnectionFactory) ctx.lookup("ConnectionFactoryName");
        connection = connectionFactory.createConnection();
        connection.start();
        session = connection.createSession(useTransaction,
        Session.AUTO_ACKNOWLEDGE);
        destination = session.createQueue("TEST.QUEUE");
        consumer = session.createConsumer(destination);
        consumer.setMessageListener(this);
    } catch (JMSException jmsEx) {
         ...
    } finally {
        producer.close();

        session.close();
        connection.close();
   }
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            System.out.println("Received message: " + message);
        }
    }
}

2.10的不同之处在于它实现了MessageListener接口的onMessage方法并且将实现类注册到JMS提供者。异步消息接收是很有用的。这意味着消费者不再需要人工地不停地从提供者那里拉消息。而是,通过注册到提供者的MessageListener实现作为回调,onMessage方法将在消息被投递的时候自动调用。

 

JMS多线程应用

JMS定义了很多并发的对象,但是只有一部分支持并发访问。ConnectionFactory,Connection,Destination对象支持并发访问;Session,MessageProducer,MessageConsumer对象不支持并发访问。也就是说,Session,MessageProducer,MessageConsumer对象不应该在多线程中共享

 

对于JMS API消息消费还有一点要说明。它提供异步的消息消费,这和EJB的消息驱动bean(message-driven beans)一样。

2
1
分享到:
评论

相关推荐

    xcf2.5使用包

    "xcf2.5使用包"指的是Apache CXF的2.5版本,这是一个广泛使用的Java框架,用于创建、消费和管理Web服务。此包包含了CXF框架的所有组件和相关依赖,方便开发者在项目中集成和使用。 Apache CXF 2.5.11是该系列的一个...

    JMS规范教程pdf

    JMS规范定义了与平台无关的API,这使得开发者可以编写一次代码,然后在任何支持JMS的平台上运行。这意味着JMS客户端程序能够轻松地在不同的操作系统和硬件架构之间迁移,只需确保目标环境有相应的JMS提供者即可。 *...

    JMS规范PDF

    - **共同特性与可移植性:** JMS专注于定义一组普遍适用的企业消息概念和工具,努力减少Java程序员在使用不同企业消息产品时需要掌握的概念数量,并最大化消息应用的可移植性。 **1.2.4 JMS不包含什么** - **明确...

    JMS与Spring之一(用JmsTemplate同步收发消息)

    JMS(Java Message Service)是一种Java API,用于在两个应用程序之间异步地发送消息。Spring框架提供了对JMS的支持,允许开发者使用JMS template或message listener container来实现消息的发送和接收。本文主要讲述...

    spring_2.5_core_lib.zip

    这些库的组合意味着这个压缩包旨在支持一个使用Spring 2.5的Java项目,提供了从对象管理、上下文环境到日志记录和元数据处理的全面支持。在实际开发中,开发者会将这些库加入到项目的类路径中,以便利用Spring框架的...

    jms规范说明

    JMS,即Java消息服务,是Java平台中的消息中间件规范,它允许应用程序创建、发送、接收和读取消息,从而在两台或多台计算机之间进行异步通信。JMS提供了点对点(Point-to-Point,P2P)和发布/订阅(Publish/...

    spring 2.5开发手册

    在《Spring 2.5 开发手册》中,会详细解释这些特性的使用方法、配置细节以及最佳实践,帮助开发者充分利用Spring框架,构建稳定、高效的应用系统。通过阅读这份手册,开发者可以深入理解Spring 2.5的工作原理,提升...

    SPRING2.5_JAR

    Spring 2.5 是一个重要的Java应用程序框架,它在企业级开发中被广泛使用,特别是在构建基于Java的可重用、模块化和松散耦合的组件方面。这个"SPRING2.5_JAR"压缩包包含的是Spring框架2.5版本的核心库,允许开发者...

    Spring Framework 2.5

    Spring Framework 2.5 是一款功能强大的企业级 Java 开发框架,旨在简化应用程序的开发过程,提高开发效率,并提供高度灵活的设计模式支持。该版本进一步增强了 Spring 的核心特性,并新增了许多功能来满足日益增长...

    JMS消息服务AcitveMQ的配置和测试小例子

    Java消息服务(Java Message Service,简称JMS)是Java平台中用于创建应用程序之间异步通信的标准API。它允许应用程序通过发送和接收消息来解耦生产者和消费者,提高系统的可扩展性和可靠性。Apache ActiveMQ是JMS的...

    EJB javaEE5 JMS1.1 JSP2.1规范中文版

    4. **JavaEE5规范**是Java企业级应用平台的一个版本,它引入了大量的新特性和改进,比如对JSF(JavaServer Faces)、JPA(Java Persistence API)、JMS(Java Message Service)和 annotations 的支持,极大地简化了...

    Struts2.5,Hibernate4,Spring3的帮助文档

    这三个框架的集成使用可以创建一个高效、可维护的Java EE应用。Struts2负责控制流程,Spring处理依赖注入和事务管理,而Hibernate则作为数据层的接口,负责与数据库的交互。这种组合可以提供良好的分层架构,提高...

    J2EE+1.6++API j2eeapi

    J2EE(Java 2 Platform, Enterprise Edition)是Java平台上用于构建企业级应用的框架,它提供了一系列的接口、类库和服务来支持开发分布式、多层的企业应用程序。J2EE 1.6版本是在2009年发布的一个重要的更新,它在...

    JAVA EE 5 API

    **JAVA EE 5 API**是Java企业版(Enterprise Edition)5的一个重要组成部分,它提供了用于构建分布式、基于Web的企业级应用程序的接口和类库。这个API涵盖了多种技术规范,包括Servlet、JSP、EJB、JMS、JTA、JPA等,...

    javaee5-doc-api

    在这个“javaee5-doc-api”压缩包中,包含的是Java EE 5的官方API文档,对于开发者来说是一份非常重要的参考资料。 **1. Servlet API** Servlet是Java EE中处理HTTP请求的核心组件。在Java EE 5中,Servlet API升级...

    spring2.5.pdf

    Spring 2.5版本是该框架的一个重大更新,引入了一系列新特性和改进,进一步提升了开发效率和应用程序的性能。本文将基于《Spring Framework-Reference Documentation Version 2.5》文档,深入剖析Spring 2.5的核心...

    Spring+JMS+ActiveMQ+Tomcat实现消息服务_服务器应用

    - **JmsTemplate**:Spring 提供了一个名为 `JmsTemplate` 的类,该类封装了 JMS API 的复杂性,简化了消息的发送和接收。通过 `JmsTemplate`,开发者可以很容易地实现消息发送逻辑。 - **消息监听器**:Spring 还...

    jms 规范教程

    JMS为消息的创建、发送、接收和读取提供了统一的接口,使得开发者能够在不同的消息中间件之间进行切换,而无需修改应用程序代码。 **1.2 什么是JMS中的消息(MESSAGING)?** 在JMS中,消息是指在两个或多个应用...

Global site tag (gtag.js) - Google Analytics