专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » springjms:Spring 系列 第 4 部分: Spring JMS 消息处理 1-2-3 »正文

springjms:Spring 系列 第 4 部分: Spring JMS 消息处理 1-2-3

来源: 发布时间:星期四, 2009年1月8日 浏览:14次 评论:0
  快速了解使用 Spring JMS 框架和 IBM WebSphere MQ 5.3 进行 JMS 消息处理基础知识  在 Spring 系列 第 4 期也是最后期中我将介绍 Spring JMS(Java 消息服务)框架特性JMS PG 定义了 Java 应用通过面向消息中间件(MOM)创建和交换消息标准途径

  就像在这个系列前面文章中我将使用个简单举例来演示 Spring JMS 特性您将随我道开发个点对点(P2P)基于消息系统使用 Spring JMS 框架通过 JMS 接口和 IBM WebSphere MQ 集成完成练习后将可以通过这个系统发送和接收简单文本消息

  在开始的前请 下载文章源代码请参阅 参考资料 访问 Spring 框架和 IBM WebSphere MQ 5.3还需要 Apache Ant 来运行举例应用

  Spring JMS

  Spring JMS 抽象框架简化了 JMS API 使用并和 JMS 提供者(比如 IBM WebSphere MQ 5.3)平滑地集成org.springframework.jms.core 包提供了在 Spring 中使用 JMS 核心功能模板类处理资源创建和释放简化了 JMS 使用

  像其他大多数 Spring 模板类JMS 模板类提供了执行公共操作 helper 思路方法在需要更复杂应用情况下类把处理任务核心委托给用户实现回调接口JMS 类提供了方便思路方法用来发送消息、同步地使用消息以及向用户公开 JMS 会话和消息制作者

  以下 JMS 包和 org.springframework.jms.core 起构成了 Spring JMS 功能:

  org.springframework.jms.support 提供转换 JMSException 功能转换代码把检测到 JMSException 层次结构转换成未检测到异常镜像层次结构 org.springframework.jms.support.converter 提供 MessageConverter 抽象以在 Java 对象和 JMS 消息的间进行转换 org.springframework.jms.support.destination 提供管理 JMS 目标区别策略比如针对 JNDI 中保存目标服务定位器 org.springframework.jms.connection 提供适合在独立应用中使用 ConnectionFactory 实现connection 还包含针对 JMS Spring PlatformTransactionManager 实现它允许把 JMS 作为事务性资源集成到 Spring 事务管理机制中

  IBM WebSphere MQ

  就像前面提到举例应用会用 Spring JMS 框架通过 JMS 接口和 IBM WebSphere MQ 集成通过在应用和 Web 服务的间传递消息WebSphere MQ 提供了可靠、有恢复能力应用集成它使用队列和事务性工具帮助保持消息跨网络完整性WebSphere MQ 降低了信息丢失风险和调和通信 IT 系统需要

  WebSphere MQ 在它所支持所有平台上提供了应用编程接口这有助于让集成可移植除了标准接口外WebSphere MQ 还完整实现了JMS 接口包括对发布-订阅消息传递支持WebSphere MQ Explorer 工具可以远程地管理和配置整个 MQ 网络管理和配置工具基于开放源码 Eclipse 框架而且是可扩展

  Spring JMS 模板

  Spring 框架提供了 JmsTemplate 两个实现JmsTemplate 类使用 JMS 1.1 API子类 JmsTemplate102 则使用 JMS 1.0.2 API举例应用使用是 JmsTemplate102

  JMS 模板被用来发送和接收 JMS 消息Spring 采用回调机制对 JMS 信息传递进行协调MessageCreator 回调接口用 JmsTemplate 中代码提供 Session 创建消息为了支持 JMS API 更复杂应用回调 SessionCallback 向用户提供了 JMS 会话而 callback ProducerCallback 则公开了 Session 和 MessageProducer 组合

  清单 1 显示了举例应用使用 JMS 模板配置清单摘自 spring-mqseries-jms.xml 文件(请参阅 下载)

  清单 1. JMS 模板配置

 <!-- JMS Queue Template -->
 <bean id="jmsQueueTemplate"
     ="org.springframework.jms.core.JmsTemplate102">
  <property name="connectionFactory">
   <ref bean="jmsQueueConnectionFactory"/>
  </property>
  <property name="destinationResolver">
   <ref bean="jmsDestinationResolver"/>
  </property>
  <property name="pubSubDo">
   <value>false</value>
  </property>
  <property name="receiveTimeout">
   <value>20000</value>
  </property>
 </bean>


  jmsQueueTemplate bean 和 JMS 连接工厂和 JMS 目标解析器绑定在用于解析 JMS 客户机通过 JNDI 提供目标队列名connectionFactory 属性指定了如何获得到 JMS 提供者连接在本例中清单 2 显示了如何从 JNDI 检索连接工厂

  清单 2. 通过 JNDI 配置 JMS 连接工厂

<!-- JMS Queue Connection Factory -->
 <bean id="ernalJmsQueueConnectionFactory"
     ="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiTemplate">
   <ref bean="jndiTemplate"/>
  </property>
  <property name="jndiName">
   <value>MQ_JMS_MANAGER</value>
  </property>
 </bean>


  可以看到JndiObjectFactoryBean 被绑定到 ernalJmsQueueConnectionFactoryJndiObjectFactoryBean 用 JndiTemplate 属性进行 JNDI 查询Spring 将用 JndiTemplate 中指定环境属性和上下文在 JNDI 中查询连接工厂清单 3 显示了 JndiTemplate 配置 bean 配置

  清单 3. JNDI 查询 JNDI 模板配置

<bean id="jndiTemplate" ="org.springframework.jndi.JndiTemplate">
  <property name="environment">
   <props>
    <prop key="java.naming.factory.initial">
      com.sun.jndi.fscontext.RefFSContextFactory
    </prop>
    <prop key="java.naming.provider.url">
      file:/C:/JNDI-Directory
    </prop>
   </props>
  </property>
 </bean>


  以上配置进行 JNDI 查询时用 com.sun.jndi.fscontext.RefFSContextFactory 指定上下文工厂用基于文件 file:/C:/JNDI-Directory 作为提供者 URL根据举例应用意图JNDI 访问会采用基于文件 FSContext 版本(请参阅 参考资料)配置把 MQ 队列绑定到 JNDI

  有了定义好 JMS 模板步就是把它绑定到举例应用然后就可以用它发送和接收消息了

  Spring JMS 实现

  JMS 模板可以绑定到应用以发送和接收 JMS 消息在清单 4 中可以看出我如何把 清单 1 中 JMS 模板绑定到举例应用

  清单 4. 把 JmsTemplate 绑定到应用

 <bean id="jmsSender"
     ="springexample.client.JMSSender">
  <property name="jmsTemplate102">
   <ref bean="jmsQueueTemplate"/>
  </property>
  </bean>
  <bean id="jmsReceiver"
     ="springexample.client.JMSReceiver">
  <property name="jmsTemplate102">
    <ref bean="jmsQueueTemplate"/>
   </property>
  </bean>


  可以看到我把 jmsQueueTemplate 绑定到用来发送和接收消息 JmsSender 应用 bean 和 JmsReceiver bean清单 5 显示了和 JMSSender 类有关代码

  清单 5. 用 JmsTemplate 发送 JMS 消息 JMSSender

public JMSSender {
  private JmsTemplate102 jmsTemplate102;
  public JmsTemplate102 getJmsTemplate102 {
   jmsTemplate102;
  }
  public void JmsTemplate102(JmsTemplate102 jmsTemplate102) {
   this.jmsTemplate102 = jmsTemplate102;
  }
  public void sendMesage{
   jmsTemplate102.send("JMS_RequestResponseQueue",
          MessageCreator {
    public Message createMessage(Session session)
         throws JMSException {
      session.createTextMessage("This is a sample message");
    }
   });
  }


  JMSSender 类用 jmsTemplate102.send 思路方法发送 JMS 消息send 思路方法个参数是 JNDI 队列名队列名指定了消息应当发送到哪里(很快就会看到如何把 WebSphere MQ 队列名绑定到 JNDI)send 思路方法第 2个参数是 MessageCreator 类JmsTemplate 中代码提供了 Session 类这个类提供了个创建 JMS 消息回调接口

  下步是用 JMS Session 类创建个简单文本消息在代码执行时消息会传递给 WebSphere MQ 服务器队列清单 6 显示了使用 JmsTemplate 检索 JMS 消息 JMSReceiver 应用 bean 代码

  清单 6. 用 JmsTemplate 检索 JMS 消息 JMSReceiver

 public JMSReceiver {
  private JmsTemplate102 jmsTemplate102;
  public JmsTemplate102 getJmsTemplate102 {
    jmsTemplate102;
  }
  public void JmsTemplate102(JmsTemplate102 jmsTemplate102) {
   this.jmsTemplate102 = jmsTemplate102;
  }
  public void processMessage{
   Message msg = jmsTemplate102.receive("JMS_RequestResponseQueue");
   try{
    TextMessage textMessage = (TextMessage) msg;
    ( msg!=null){
    .out.prln(" Message Received -->" +
          textMessage.getText);
    }
   }catch(Exception e){
      e.prStackTrace;
   }
  }
}


  JMSReceiver 类用 jmsTemplate102.receive 思路方法同步地接收 JMS 消息receive 思路方法指定 JNDI 队列名并从中检索消息JMSTemplate 类 processMessage 思路方法由接收 JMS 客户机JSMTemplate bean 属性 receiveTimeout(列在 JMSTemplate 配置中)指定接收客户机同步地从队列中接收消息时要等候时间

  现在应用代码已完成!下步就是配置 WebSphere MQ 队列并把它们绑定到 JNDI 对象

  队列管理器设置

  在运行应用的前需要设置 WebSphere MQ 队列管理器和队列并把它们绑定到 JNDI如果喜欢可以按照这部分举例做:只需 下载 设置 WebSphere MQ 队列批文件和应用源代码和部署描述符即可把 zip 文件解压到驱动器 C:

  设置队列

  运行 C:SpringSeriesPart4JMSbatch 文件夹中 mqup.bat 文件这个批文件要求在 path 环境变量中设置好 MQ 安装 bin 文件夹(例如 C:mqseriesbin)运行了批文件的后应当看到消息 “All valid MQSC commands were processed”要打开 MQ Explorer 并检查已经创建队列管理器和队列请选择 Start -> Programs -> IBM MQSeries -> MQSeriesExplorer图 1 显示出举例应用 QueueManager MQJMS.QManager 已经创建并正在运行

  图 1. WebSphere MQ QueueManager 配置

    appContext.getBean("jmsSender");

  消息传递到队列上的后请运行 JMS 接收方客户机以检索消息请打开命令提示符切换到目录 SpringProject4并输入:

> ant -f build-jmsreceiver.xml

  这会构建并运行 ReceiveMQSpringJMS 类该类会 JMSReceiver 类以从 WebSphere MQ RequestResponse 队列接收文本消息在控制台上会打印出以下消息:

Message Received --> This is a sample message.

  结束语

  在 Spring 系列最后这篇文章中您学习了 Spring JMS 框架基础我首先介绍了举例应用核心组件 —— Spring JMS 框架和 IBM WebSphere MQ 5.3然后介绍了如何用 Spring JMS 模板向 WebSphere MQ 队列发送消息和从中接收消息虽然这个举例非常简单但是可以把这里介绍步骤应用到更复杂应用



  我希望介绍 Spring 框架核心模块系列对您有所帮助请参阅 参考资料 学习更多有关 Spring 框架和 Spring JMS 内容



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: