`

jms 学习笔记2

阅读更多

JMS 异步消息传输,客户端将消息发给消息中介,可以保证消息被可靠的投递,即使在服务器服务中断,当服务恢复正常时,仍然可以恢复消息队列.  之前学习了,JMS简单送消息,但是为了方便操作以及代码的简化,Spring提供的消息转化器来简化消息发送和接收时的转化过程:

消息转化器接口: org.springframework.jms.support.converter.MessageConverter ,些接口简单明了,只有两个方法:将消息转化成对象和将圣像转化为消息,下面是个简单的例子:

package com.kesn.jms.converter;

import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Session;

import org.springframework.jms.support.converter.MessageConversionException;
import org.springframework.jms.support.converter.MessageConverter;

import com.kesn.jms.entity.Motorist;

/**
 * Spring 提供的消息转化器
 * @author LEPING LI
 */
public class MotoristConverter implements MessageConverter {

 /**
  * 将消息报转化为对象
  */
 public Object fromMessage(Message message) throws JMSException,
   MessageConversionException {
  if(!(message instanceof MapMessage)){
   throw new MessageConversionException("Message is not a MapMessage!");
  }
  MapMessage map=(MapMessage)message;
  Motorist m=new Motorist();
  m.setName(map.getString("name"));
  m.setEmail(map.getString("email"));
  m.setAge(map.getString("age"));
  return m;
 }

 /**
  * 将对象转化为消息
  */
 public Message toMessage(Object obj, Session session) throws JMSException,
   MessageConversionException {
  if(!(obj instanceof Motorist)){
   throw new MessageConversionException("obj is not a Motorits!");
  }
  Motorist m=(Motorist)obj;
  MapMessage message=session.createMapMessage();
  message.setString("name", m.getName());
  message.setString("email", m.getEmail());
  message.setString("age", m.getAge());
  return message;
 }

}

将消息转化器置入JmsTemplate

 

<!-- JMS模板 -->
 <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  <property name="connectionFactory" ref="connectionFactory"/>
  <property name="messageConverter" ref="motoristConverter"/>
 </bean>

 

如此设置,有发送消息和接收消息时使用相关方法可以消除消息的转化过程

package com.kesn.jms.service.impl;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;

import org.springframework.jms.JmsException;
import org.springframework.jms.core.JmsTemplate;

import com.kesn.jms.entity.Motorist;
import com.kesn.jms.service.JmsTemplateReceiveService;
/**
 * 使用JmsTemplate 发送消息
 * @author LEPING LI
 *
 */
public class KesnJmsTemplateMessageReceiver implements JmsTemplateReceiveService{
 
 private JmsTemplate jmsTemplate;
 public void setJmsTemplate(JmsTemplate jmsTemplate) {
  this.jmsTemplate = jmsTemplate;
 }
 private Destination destination;
 public void setDestination(Destination destination) {
  this.destination = destination;
 }

 @Override
 public Motorist receiveMessage() {
//  try {
//   MapMessage message=(MapMessage) jmsTemplate.receive(destination);
//   Motorist m=new Motorist();
//   m.setName(message.getString("name"));
//   m.setEmail(message.getString("email"));
//   m.setAge(message.getString("age"));
//   return m;
//  } catch (JmsException e) {
//   e.printStackTrace();
//  }
//  return null;
  return (Motorist)jmsTemplate.receiveAndConvert(destination);
 }
}

package com.kesn.jms.service.impl;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Session;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;

import com.kesn.jms.entity.Motorist;
import com.kesn.jms.service.JmsTemplateSendService;
/**
 * 使用JmsTemplate 发送消息
 * @author LEPING LI
 *
 */
public class KesnJmsTemplateMessageSender implements JmsTemplateSendService{
 private JmsTemplate jmsTemplate;
 public void setJmsTemplate(JmsTemplate jmsTemplate) {
  this.jmsTemplate = jmsTemplate;
 }
 private Destination destination;
 public void setDestination(Destination destination) {
  this.destination = destination;
 }
 
 @Override
 public void sendMessage(final Motorist m) {
//  jmsTemplate.send(destination, new MessageCreator(){
//   @Override
//   public Message createMessage(Session session) throws JMSException {
//    MapMessage message=session.createMapMessage();
//    message.setString("name",m.getName());
//    message.setString("email",m.getEmail());
//    message.setString("age", m.getAge());
//    return message;
//   }
//  });
  jmsTemplate.convertAndSend(destination, m);
 }
}

在发送和接收的消息时,JmsTemplate 方法自动应该消息转化器

 

 

以上都是采用注入JmsTemplate 的方式来使用操作消息,和其它模板一样,Spring也提供了JmsTemplate 对应的支持类 JmsGatewaySupport ,通过继承该类,可能通过getJmsTemplate 方法获取到JmsTemplate 模板

 

通常的编程模式我们都更倾向于基于Pojo的编程,EJB2中MDB消息驱动Bean必须实现 javax.ejb.MessageDrivenBean 接口,EJB3不再需要实现该接口,但是还是要去实现一个监听器接口:MessageListener ,更像POJO,但还是POJO,Spring2中提供的消息驱动Bean采用了EJB3类型的方式,我们称Spring消息驱动Pojo为MDP ,下面是一个简单的例子:

 

创建一个消息驱动Pojo

package com.kesn.jms.mdp;

import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;

import org.apache.log4j.Logger;

import com.kesn.jms.entity.Motorist;
/**
 * 创建消息监听器
 * @author LEPING LI
 *
 */
public class MarkingMdp implements MessageListener {
 private Logger log=Logger.getLogger(MarkingMdp.class);
 @Override
 public void onMessage(Message message) {
  MapMessage map=(MapMessage)message;
  Motorist m=new Motorist();
  try {
   m.setName(map.getString("name"));
   m.setEmail(map.getString("email"));
   m.setAge(map.getString("age"));
   log.info("name:"+m.getName());
  } catch (JMSException e) {
   e.printStackTrace();
  }
 }
}

上面MDP就是实现一个MessageListener 监听器接口,了队列和主题有消息时,系统为自动调用MDP的onMessage方法来处理消息

但是JMS是如何自动调用onMessage方法来处理消息呢?消息监听的处理方式是这样的:消息监听器容器一个用于查看JMS目标,等待消息的特 殊Bean,一量消息到达,就会获取消息,并通过onMessage方法来处理消息;Spring提供的 消息监听器容器有以下三种:

SimpleMessageListenerContainer 最简单的消息监听容器,处理有限数据量的消息,不支持事务

DefaultMessageListenerContainer 支持事务

ServerSessionMessageListenerConatainer  支持更强大的功能,支持事务,允许动态管理JMS会话

 

消息监听器有Spring中的配置如下:

<!-- 消息监听器 -->
 <bean id="markingMdp" class="com.kesn.jms.mdp.MarkingMdp"/>
 <bean class="org.springframework.jms.listener.SimpleMessageListenerContainer">
  <property name="connectionFactory" ref="connectionFactory"/>
  <property name="destination" ref="kesnQDestination"/>
  <property name="messageListener" ref="markingMdp"/>
 </bean>

 

如果需要事务可以使用:DefaultMessageListenerConatiner 配置如下

<!-- 消息监听器 -->
 <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  <property name="connectionFactory" ref="connectionFactory"/>
  <property name="destination" ref="kesnQDestination"/>
  <property name="messageListener" ref="markingMdp"/>
  <property name="transactionManager" ref="jmsTransactionManager"/>
 </bean>
 
 <!-- JMS事务管理器 -->
 <bean  id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
  <property name="connectionFactory" ref="connectionFactory"/>
 </bean>

 

 

下面学习一下如何用Spring创建一个纯POJO的MDP

上面的方式或多或不都使用了一定的JMS API,如何实现一个更POJO的MDP呢,Spring提供了一适配器 MessageListenerAdpater ,是一个MessageListener ,可能委派Bean和指定的方法,所谓适配器简单的说就是包装目标对象,增强其功能;我们将采用spring 配置的方式对之前的MDP(或是一个简单的POJO)经过适配器包装后形成新的监听器,配置如下:

<!-- 纯POJO MDP Bean -->
    <bean id="markingPojoMdp" class="com.kesn.jms.pojomdp.MarkingMdp"/>
   
    <bean id="purePojoMdp" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
        <property name="delegate" ref="markingPojoMdp"/>
        <property name="defaultListenerMethod" value="handleMessage"/>
    </bean>
   
    <!-- 配置监听器容器 -->
    <bean class="org.springframework.jms.listener.SimpleMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="destination" ref="kesnQDestination"/>
        <property name="messageListener" ref="purePojoMdp"/>
    </bean>

 

 

通过在监控器中转入消息转化器,可以简单化消息接收的发送代码

<bean id="purePojoMdp" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
        <property name="delegate" ref="markingPojoMdp"/>
        <property name="defaultListenerMethod" value="handleMessage"/>
        <property name="messageConverter" ref="motoristConverter"/>
    </bean>

 

接收消息的代码可以转化为:

public void handleMessage(Motorist m) {
        log.info("name:"+m.getName());
    }

 

至些我们建立的MDP已经是完成基于POJO的了

分享到:
评论

相关推荐

    JMS学习笔记精心总结

    **JMS学习笔记精心总结** Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用间异步通信的一种标准接口。它允许应用程序创建、发送、接收和读取消息,使得应用程序能够在不直接连接的情况下...

    JMS学习笔记(一)——JMS简介安装ActiveMQ

    **JMS学习笔记(一)——JMS简介与ActiveMQ安装** Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用间异步通信的标准接口。它为应用程序提供了一种标准的方式,用来创建、发送、接收和读取...

    jms学习笔记jms学习笔记

    本文主要探讨的是消息中间件(Message-Oriented Middleware,简称MOM),特别是在Java消息服务(Java Message Service,JMS)的学习笔记。 JMS是Java平台上的一个标准API,用于在分布式环境中进行异步消息传递。它...

    JMS学习笔记

    **JMS学习笔记** Java消息服务(Java Message Service,简称JMS)是Java平台中用于在分布式环境中交换异步消息的标准API。它提供了一种可靠的消息传递机制,使得应用程序可以在不互相依赖的情况下进行通信,从而...

    JMS相关,教程,例子,学习笔记

    通过阅读**jms学习笔记.docx** 和 **JMS例子.docx**,你可以深入理解JMS的使用方式,获取实践经验。而 **JMS教程.pdf** 和 **基于XML和JMS的异构数据交换集成的研究.pdf** 则提供了理论基础和高级应用场景的讲解,有...

    ActiveMQ学习笔记(二) JMS与Spring

    在本篇ActiveMQ学习笔记中,我们将探讨JMS(Java Message Service)与Spring框架的集成。JMS是一种标准API,用于在分布式环境中进行异步消息传递,而Spring框架则为开发人员提供了强大的依赖注入和管理服务的能力。...

    RocketMQ学习笔记 1

    RocketMQ学习笔记 1是关于Apache RocketMQ的学习笔记,涵盖了RocketMQ的基本概念、架构、消息模型、Producer和Consumer的基本概念、JMS规范等知识点。 1. 消息模型 在RocketMQ中,消息模型是指消息的生产、存储和...

    JAVA学习笔记————————

    2. **面向对象编程**:JAVA是纯面向对象的语言,因此学习笔记中会详细讲解类的创建、继承、封装、多态等概念。同时,接口、抽象类以及访问修饰符也是重要的知识点。 3. **异常处理**:JAVA提供了一种结构化的异常...

    active mq 学习笔记

    ### ActiveMQ学习笔记知识点梳理 #### 一、ActiveMQ简介 **定义:** - **ActiveMQ**是由Apache出品的一款功能强大的开源消息中间件。作为消息队列(Message Queue,简称MQ)的一种,它主要用来在分布式系统之间...

    javaEE学习笔记

    本学习笔记涵盖了JavaEE的核心技术,帮助学习者深入理解和掌握javaweb的各项技能。 1. **Servlet与JSP** - **Servlet**:Servlet是Java编写的服务器端程序,主要用于扩展服务器的功能。在JavaEE中,Servlet处理...

    JavaEE学习笔记

    ### JavaEE 学习笔记概览 #### 一、JavaEE 概念及发展历程 JavaEE(Java Platform, Enterprise Edition)是Sun Microsystems公司为简化企业级应用开发而提出的一套标准化平台,它提供了构建分布式系统的基本框架和...

    软件工程师学习笔记J2EE

    《软件工程师学习笔记J2EE》是一份针对Java企业级应用开发(J2EE)的详尽学习资源,对于想要深入理解和掌握J2EE技术体系的软件工程师来说,具有极高的参考价值。这份笔记不仅全面覆盖了J2EE的基础概念,还深入探讨了...

    J2EE学习笔记 对学习非常有帮助

    **J2EE学习笔记概述** J2EE(Java 2 Platform, Enterprise Edition)是Java平台的一个版本,专门针对企业级应用开发。它提供了一个全面的框架来构建、部署和管理多层、分布式、跨平台的企业应用程序。J2EE学习笔记...

    Java-J2EE全部学习笔记 培训结构的学习资料

    这份"Java-J2EE全部学习笔记 培训结构的学习资料"涵盖了从基础到高级的Java编程和J2EE应用开发的知识点,对于想要深入理解Java EE技术的人来说是一份宝贵的资源。 1. **Java基础知识**:这部分可能包括Java语言的...

    j2ee学习笔记很好的

    【J2EE学习笔记概述】 J2EE,全称为Java 2 Platform, Enterprise Edition,是Java平台上用于构建企业级应用的框架。它提供了一个统一的标准和可扩展的平台,允许开发人员创建分布式、多层的企业应用程序。J2EE的...

Global site tag (gtag.js) - Google Analytics