`
JFires
  • 浏览: 41810 次
  • 性别: 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
分享到:
评论

相关推荐

    Spring API

    9.9.1. 对一个特定的 DataSource 使用了错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. 选择一种...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

     本书内容主要包括三部分,第一部分介绍java ee开发的基础知识,以及如何搭建开发环境,包括安装jboss、weblogic应用服务器,以及如何使用svn、netbeans等。第二部分详细讲解了jsf ri、jta、jndi、rmi、jms、...

    Spring in Action(第2版)中文版

    2.5控制bean创建 2.5.1bean范围化 2.5.2利用工厂方法来创建bean 2.5.3初始化和销毁bean 2.6小结 第3章高级bean装配 3.1声明父bean和子bean 3.1.1抽象基bean类型 3.1.2抽象共同属性 3.2方法注入 3.2.1基本...

    Spring in Action(第二版 中文高清版).part2

    2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 初始化和销毁Bean 2.6 小结 第3章 高级Bean装配 3.1 声明父Bean和子Bean 3.1.1 抽象基Bean类型 3.1.2 抽象共同属性 3.2 方法注入...

    Spring in Action(第二版 中文高清版).part1

    2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 初始化和销毁Bean 2.6 小结 第3章 高级Bean装配 3.1 声明父Bean和子Bean 3.1.1 抽象基Bean类型 3.1.2 抽象共同属性 3.2 方法注入...

    JBPM4工作流应用开始指南.rar

    41 2.9.5 导入和使用范例 41 2.10 例程:jBPM HelloWorld 43 2.11 小结 45 第3章 使用jBPM图形化流程设计器(GPD)设计流程 46 3.1 创建一个新流程 47 3.2 编辑流程定义源 49 3.3 例程:设计一个“复杂的”业务流程 ...

    springboot参考指南

    创建一个非web(non-web)应用 ii. 63. 属性&配置 i. 63.1. 外部化SpringApplication配置 ii. 63.2. 改变应用程序外部配置文件的位置 iii. 63.3. 使用'short'命令行参数 iv. 63.4. 使用YAML配置外部属性 v. 63.5. ...

    Spring中文帮助文档

    9.9.1. 对一个特定的 DataSource 使用了错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. 选择一...

    cxf2.5源码

    CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输...

    Spring 2.0 开发参考手册

    6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 7.2.3. AspectJ切入点表达式 7.2.4. ...

    cascading-release-maven-plugin:多项目Maven发布插件,一键发布多组项目

    每个“模块”都有自己的生命周期和版本控制方案,例如 api-1 可以有 2.5 版,api-2 可以有 1.2 版等。 假设从一个模块到另一个模块存在依赖关系。 然后很快就在这个项目中工作变得很痛苦,要么是因为你必须经常...

    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中文参考手册)

    6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入...

    Java_EE_6规范中文版

    2.4 容器 2.5 资源适配器 2.6 数据库 2.7 Java EE标准服务 2.8 互用性 2.9 产品标准的灵活性 2.10 Java EE产品的扩展 2.11 平台角色 2.12 平台协议 2.13 J2EE 1.3中的变化 2.14 J2EE 1.4中的变化 2.15 Java EE 5...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java应用软件程序设计

    Reply模式的JMS应用 421 实例120 使用Java IDL 426 实例121 EJB与CORBA的交互 430 实例122 基于EJB的真实世界模型 433 实例123 EJB的商业应用——定购单 447 第11章 Java 2 Platform Micro Edition...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    大型分布式网站架构与实践

     如何进行Java应用故障的在线排查,包括一系列排查工具的使用,以及一些实际案例的介绍等。  4.1 在线日志分析 220  4.1.1 日志分析常用命令 220  4.1.2 日志分析脚本 230  4.2 集群监控 239  4.2.1 监控指标 ...

    Java测试新技术TestNG和高级概念.part1

    无论您使用TestNG,JUnit或其他测试框架,本书提供的测试设计模式都会告诉您如何改进您的测试,对如何让代码和设计变得更可测试提供具体的建议。 目录: 第1章 起步 1.1 超越JUnit 3 1.2 JUnit 4 1.3 针对可测试性而...

Global site tag (gtag.js) - Google Analytics