`

jms 学习笔记1

阅读更多

今天有学习一下JMS,从一个简单例子开始

名词概念: 消息中介ActiveMQ    消息   队列   主题

  JMS定义了Java中访问消息中间件的接口

  JMS只是接口,并没有给予实现,实现JMS接口的消息中间件叫JMS   Provider,这样的消息中间件可以从Java里通过JMS接口进行调用。         
  JMS结构:header和body。header包含消息的识别信息和路由信息,body包含消息的实际数据。         
   JMS消息分类:    
  BytesMessage   消息是字节流。    
  MapMessage   消息是一系列的命名和值的对应组合。    
  ObjectMessage   消息是一个流化的Java对象。    
  StreamMessage   消息是Java中的输入输出流。    
  TextMessage   消息是一个字符串,这种类型将会广泛用于XML格式的数据。

下面是一个点对点模式的JMS例子:

建立WEB工程 导入ActiveMQ Spring 相关jar包,工程相关文件如下:

web.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "
 xmlns="http://java.sun.com/xml/ns/javaee " xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd "
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd "
 id="WebApp_ID" version="2.5">
 <display-name>jms</display-name>

 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
</web-app>

 

spring 文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans "
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "
  xmlns:aop="http://www.springframework.org/schema/aop "
  xmlns:tx="http://www.springframework.org/schema/tx "
  xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd ">
 <!-- 定义消息中介的连接工厂 -->
 <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
  <property name="brokerURL" value="tcp://localhost:61616"/>
 </bean>
 
 <!-- 定义一个队列,存放消息 -->
 <bean id="kesnQDestination" class="org.apache.activemq.command.ActiveMQQueue">
  <constructor-arg index="0" value="kesn.queue"/>
 </bean>
 
 <!-- 定义一个主题,用于发布消息 -->
 <bean id="kesnTDestination" class="org.apache.activemq.command.ActiveMQTopic">
  <constructor-arg index="0" value="kesn.topic"/>
 </bean>
 
 <!-- JMS模板 -->
 <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  <property name="connectionFactory" ref="connectionFactory"/>
 </bean>
 
 <!-- 消息接收者 -->
 <bean id="messageReceiver" class="com.kesn.jms.service.impl.KesnJmsTemplateMessageReceiver">
  <property name="jmsTemplate" ref="jmsTemplate"/>
  <property name="destination" ref="kesnQDestination"/>
 </bean>
 
 <!-- 消息发送者 -->
 <bean id="messageSender" class="com.kesn.jms.service.impl.KesnJmsTemplateMessageSender">
  <property name="jmsTemplate" ref="jmsTemplate"/>
  <property name="destination" ref="kesnQDestination"/>
 </bean>
</beans>

 

一个简单的发送消息和接收消息的类

 

package com.kesn.jms.demo;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.log4j.Logger;

/**
 * 消息的发送者
 * @author LEPING LI
 * @version 1.0.0
 */
public class KesnMessageSender {
 private static Logger log=Logger.getLogger(KesnMessageSender.class);
 public static void main(String[] args) {
  ConnectionFactory cf=new ActiveMQConnectionFactory("tcp://localhost:61616");
  Connection con=null;
  Session session=null;
  try {
   con=cf.createConnection();
   //创建会话
   session=con.createSession(false, Session.AUTO_ACKNOWLEDGE);
   //创建队列
   Destination dest=new ActiveMQQueue("kesn.queue");

 

   //创建主题可以实现发布--订阅模式
   //Destination dest=new ActiveMQTopic("kesn.queue");


   //session是的消息生产者和发送者的工厂
   MessageProducer producer=session.createProducer(dest); //创建消息生产者
   TextMessage message=session.createTextMessage();  //创建消息
   message.setText("老婆,我爱你!"); 
   producer.send(message);         //发送消息
   log.info("消息发送成功!");
  } catch (JMSException e) {
   e.printStackTrace();
  }finally{
   try {
    if(session!=null){
     session.close();
    }
    if(con!=null){
     con.close();
    }
   } catch (JMSException e) {
    e.printStackTrace();
   }
  }
  
 }
}

 

package com.kesn.jms.demo;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.log4j.Logger;

/**
 * 消息接收者
 * @author LEPING LI
 *
 */
public class KesnMessageReceiver {
 private static Logger log=Logger.getLogger(KesnMessageReceiver.class);
 public static void main(String[] args) {
  ConnectionFactory cf=new ActiveMQConnectionFactory("tcp://localhost:61616");
  Connection con=null;
  Session session=null;
  try {
   con=cf.createConnection();
   //创建会话
   session=con.createSession(false, Session.AUTO_ACKNOWLEDGE);
   //创建队列
   Destination dest=new ActiveMQQueue("kesn.queue");

   //创建主题可以实现发布--订阅模式
   //Destination dest=new ActiveMQTopic("kesn.queue");
   MessageConsumer consumer=session.createConsumer(dest); //创建消息消费者
   con.start();
   Message message=consumer.receive();      //接收消息
   TextMessage textMessage=(TextMessage)message;   
   log.info("收到消息:"+textMessage.getText());
  } catch (JMSException e) {
   e.printStackTrace();
  }finally{
   try {
    if(session!=null){
     session.close();
    }
    if(con!=null){
     con.close();
    }
   } catch (JMSException e) {
    e.printStackTrace();
   }
  }
  
 
 }

 

由于JMS上面中存在大量的代码冗余,可以采用Spring 提示的JmsTemplate 来简化操作

接口类省略

 

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;
   }
  });
 }
}


}

 

 

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();
  } catch (JMSException e) {
   e.printStackTrace();
  }
  return null;
 }
}

 

测试类,SE环境下测试

package com.kesn.jms.client;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.kesn.jms.entity.Motorist;
import com.kesn.jms.service.impl.KesnJmsTemplateMessageSender;

public class MessageSendClient {
 private static Logger log=Logger.getLogger(MessageSendClient.class);
 public static void main(String[] args) {
  ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
  KesnJmsTemplateMessageSender sender=(KesnJmsTemplateMessageSender) context.getBean("messageSender");
  Motorist m=new Motorist();
  m.setName("李乐平");
  m.setEmail("lilpjob");
  m.setAge("1");
  sender.sendMessage(m);
  log.info("消息发送成功!");
 }
}

package com.kesn.jms.client;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.kesn.jms.entity.Motorist;
import com.kesn.jms.service.impl.KesnJmsTemplateMessageReceiver;

public class MessageReciveClient {
 private static Logger log=Logger.getLogger(MessageReciveClient.class);
 public static void main(String[] args) {
  ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
  KesnJmsTemplateMessageReceiver receiver=(KesnJmsTemplateMessageReceiver) context.getBean("messageReceiver");
  Motorist m=receiver.receiveMessage();
  log.info("name:"+m.getName());
  log.info("email:"+m.getEmail());
  log.info("age:"+m.getAge());
 }
}

 

 

 初学者问题颇多,在使用连接创建会话时,第一个参数boolean transacted  是否加以事务管理? 如果改为true ,客户端接收不到消息!还没有搞明白! 

 JMS称消息的异步传输,只是对于点对点的模式面言吗? 发布--订阅模式好像消息消费者只有在监听情况下才能接收到发布到主题的消息! ??

分享到:
评论

相关推荐

    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学习笔记————————

    在深入探讨JAVA学习笔记之前,我们首先理解一下JAVA这一编程语言的重要性。JAVA,由Sun Microsystems公司(现已被Oracle收购)于1995年推出,是一种面向对象的、跨平台的编程语言,以其“一次编写,到处运行”的特性...

    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公司为简化企业级应用开发而提出的一套标准化平台,它提供了构建分布式系统的基本框架和...

    JAVA学习笔记1

    ### JAVA学习笔记1:深入解析J2EE框架与关键技术 #### J2EE模式与Value Object概念 在JAVA学习之旅中,深入理解J2EE(Java 2 Platform, Enterprise Edition)框架是至关重要的一步。J2EE是专为开发企业级应用而...

    软件工程师学习笔记J2EE

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