JMS的全称是Java Message Service,即Java消息服务。它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息。把它应用到实际的业务需求中的话我们可以在特定的时候利用生产者生成一消息,并进行发送,对应的消费者在接收到对应的消息后去完成对应的业务逻辑。对于消息的传递有两种类型,一种是点对点的,即一个生产者和一个消费者一一对应;另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。

整合activeMQ到springmvc项目也很简单

只需要增加如下的maven依赖即可,初学者请直接添加all这个jar,否则如果jar包冲突会影响信心的

<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.13.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>

开发步骤:

① 添加好maven依赖后,请到 http://activemq.apache.org/ 下载最新版的activeMQ, 我这里下载的是5.13.2,下载解压后执行bin中的activemq.bat进行启动

② 理解JMS工作原理

  1.首先配置链接信息

和操作数据库一样,我们要根据数据库地址和链接信息,来配置datasource一样,activemq类同,底层首先需要由activemq厂商提供的驱动,根据具体地址,封装一个ConnectionFactory, 这是最基本的配置, 同时由于是由Spring进行统一管理, 所以需要将ConnectionFactory注入到sping。jms中的ConnectionFactory。这样链接就配置好了。

<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616" />
</bean> <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="connectionFactory"
class="org.springframework.jms.connection.SingleConnectionFactory">
<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="targetConnectionFactory" />
</bean>

同理 spring.jms 提供了 SingleConnectionFactory和CachingConnectionFactory,这里我们使用的SingleConnectionFactory,根据意思也知道得八九不离十了,

SingleConnectionFactory就是每次请求都返回同一个链接,从启动开始就一直打开,不会关闭。 而CachingConnectionFactory就和数据库的链接池一样,可以缓存很多信息,在用户很多的情况下,同等情况下会增加效率。

同时activeMQ也提供了PooledConnectionFactory,这样也可以缓存很多信息,减少资源的使用,配置如下

<!-- 使用pool进行链接 -->
<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->
<!-- <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> -->
<!-- <property name="brokerURL" value="tcp://localhost:61616"/> -->
<!-- </bean> --> <!-- <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"> -->
<!-- <property name="connectionFactory" ref="targetConnectionFactory"/> -->
<!-- <property name="maxConnections" value="10"/> -->
<!-- </bean> --> <!-- <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory"> -->
<!-- <property name="targetConnectionFactory" ref="pooledConnectionFactory"/> -->
<!-- </bean> -->

2。配置好ConnectionFactory之后我们就需要配置生产者。生产者负责产生消息并发送到JMS服务器,这通常对应的是我们的一个业务逻辑服务实现类。但是我们的服务实现类是怎么进行消息的发送的呢?这通常是利用Spring为我们提供的JmsTemplate类来实现的,所以配置生产者其实最核心的就是配置进行消息发送的JmsTemplate。对于消息发送者而言,它在发送消息的时候要知道自己该往哪里发,为此,我们在定义JmsTemplate的时候需要往里面注入一个Spring提供的ConnectionFactory对象。

<!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<property name="connectionFactory" ref="connectionFactory" />
</bean>

在发送消息的时候,除了知道activemq的地址外,还需要让发送者知道具体发给谁?

activemq提供了两种模式,一个是点对点的 ,一个是发送给多个订阅者这种订阅模式

    <!--这个是队列目的地 -->
<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg>
<value>queue</value>
</constructor-arg>
</bean> <!--这个是主题目的地,一对多的-->
<bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg value="topic"/>
</bean>

这样发送者相关配置就已经完成了。

③ 发送者发送消息的服务类: 很简单,调用上面配置好的jmsTemplate。send方法就好了

package xiaochangwei.zicp.net.jms;

import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session; import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service; @Service
public class ProducerServiceImpl implements ProducerService { @Resource
private JmsTemplate jmsTemplate; public void sendMessage(Destination destination, final String message) {
jmsTemplate.send(destination, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(message);
}
});
}
}

至此发送者相关的都已经全部完成了,下面配置接受者

④  接收者配置,接收者和发送者的链接信息都是一样的,不然收不到信息是不, 除了链接信息,要知道什么时候有消息发送过来,接收者这边就要实现一个消息监听器,

当监听到消息后,进行相应的业务处理,每个目的地都有一个MessageListenerContainer,配置MessageListenerContainer需要链接信息,目的地信息,和接受者的消息监听器

<!-- 消息监听器 -->
<bean id="consumerMessageListener"
class="xiaochangwei.zicp.net.jms.ConsumerMessageListener" />
<!-- 消息监听容器 -->
<bean id="jmsContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="queueDestination" />
<property name="messageListener" ref="consumerMessageListener" />
</bean>

这里我们进行一个业务模拟

A系统通过activemq发送命令串给B系统, B系统收到命令后,根据约定的规则进行解析,并进行业务处理

A系统调用ProducerServiceImpl中的 sendMessage 进行消息发送,为减少传递量,均采用json发送,代码如下:

package xiaochangwei.zicp.net.web.controller;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map; import javax.jms.Destination; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import xiaochangwei.zicp.net.common.tools.JsonUtil;
import xiaochangwei.zicp.net.entity.TestEntity;
import xiaochangwei.zicp.net.jms.ProducerService; @Controller
@RequestMapping("jms")
public class JmsTestController { @Autowired
private ProducerService producerService;
@Autowired
@Qualifier("queueDestination")
private Destination destination; @RequestMapping("test")
public @ResponseBody String testSend() throws Exception { //系统业务需要, 需要更新用户表中信息,根据id更新name
List<TestEntity> list = new LinkedList<TestEntity>(); TestEntity en = new TestEntity();
en.setId(100);
en.setName("name1");
list.add(en); TestEntity en2 = new TestEntity();
en2.setId(1002);
en2.setName("name2");
list.add(en2); Map<String,Object> mapEntity = new HashMap<String, Object>();
mapEntity.put("user", list); Map<String,Object> map = new HashMap<String, Object>();
map.put("update", mapEntity); System.out.println("发送方发送内容为:" + JsonUtil.object2String(map));
//发送更新数据请求
producerService.sendMessage(destination, JsonUtil.object2String(map)); return "jms exute complete";
}
}

接收者根据约定,知道收到的消息都是json字符串,所以直接按text处理

package xiaochangwei.zicp.net.jms;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage; public class ConsumerMessageListener implements MessageListener { public void onMessage(Message message) {
TextMessage textMsg = (TextMessage) message;
try {
System.out.println("接收者受到消息:" + textMsg.getText());
System.out.println("开始进行解析并调用service执行...."); } catch (JMSException e) {
e.printStackTrace();
}
} }

这里没有具体的去解析并执行具体操作,只是打印出来而已,只确认发送方发送的内容和接受方接收到的内容一致即可。

可以看到发送方和接收方内容一直

解释下这段json想表达的意思: 更新(update)用户信息(user),把id=100的用户 name更新为name1 ........

整合就讲到这里,后续会讲到消息监听器,转换器等进阶知识,感兴趣的朋友可以持续关注

JMS学习之路(一):整合activeMQ到SpringMVC的更多相关文章

  1. JMS学习之路(一):整合activeMQ到SpringMVC 转载:http://www.cnblogs.com/xiaochangwei/p/5426639.html

    JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以 ...

  2. springboot 学习之路 8 (整合websocket(1))

    目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...

  3. webService学习之路(三):springMVC集成CXF后调用已知的wsdl接口

    webService学习之路一:讲解了通过传统方式怎么发布及调用webservice webService学习之路二:讲解了SpringMVC和CXF的集成及快速发布webservice 本篇文章将讲 ...

  4. JMS学习篇《一》ActiveMQ消息中间件的简单介绍与用法-概念篇

    原创说明:本篇博文为本人原创作品,转载请注明出处 1.何为消息中间件 消息中间件是一种在分布式应用中互相交换信息的一种技术,常见的成熟消息中间件有:RabbitMQ.SonicMQ,activeMQ. ...

  5. JMS学习(二)之ActiveMQ

    1,ActiveMQ是Apache实现的基于JMS的一个消息服务器.下面记录ActiveMQ的一些基本知识. 2,ActiveMQ connectors:ActiveMQ providesconnec ...

  6. JMS学习二(简单的ActiveMQ实例)

    下载安装ActiveMQ服务,下载地址当然可以去官网下载 http://activemq.apache.org/download-archives.html ActiveMQ安装很简单,下载解压后到b ...

  7. springboot 学习之路 20 (整合RabbitMQ)

    整合RabbitMQ: 我的操作系统是window7 ,所以在整合ribbotMQ之前需要先安装rabbitMq服务:安装步骤请参考:window下安装RabbitMQ  这个详细介绍了安装步骤,请按 ...

  8. springboot 学习之路 14(整合mongodb的Api操作)

    springboot整合mongodb: mongodb的安装和权限配置  请点击连接参考 mongodb集成 : 第一步:引如pom文件 第二步:配置文件配置mongodb路径: 第三步:关于mon ...

  9. webService学习之路(二):springMVC集成CXF快速发布webService

    继上一篇webService入门之后,http://www.cnblogs.com/xiaochangwei/p/4969448.html ,现在我将我周六在家研究的结果公布出来 本次集成是基于之前已 ...

随机推荐

  1. boost强分类器的实现

    boost.cpp文件下: bool CvCascadeBoost::train( const CvFeatureEvaluator* _featureEvaluator, int _numSampl ...

  2. Centos——安装JDK

    写在前面: Just mark! 创建linux虚拟机的时候经常要安装JDK,配置环境变量,却又经常忘记,这里记录一下. 环境:Centos-6.8-x86_64-minimal JDK :jdk-7 ...

  3. Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...

  4. 3.Windows Server 2012 R2数据库部署

    很多人竟然不会安装数据库....好吧,来个图文教程,其实和windows里面一样安装,和安装2008一样的 先安装3.5:http://www.cnblogs.com/dunitian/p/53487 ...

  5. 理解 .NET Platform Standard

    相关博文:ASP.NET 5 Target framework dnx451 and dnxcore50 .NET Platform Standard:https://github.com/dotne ...

  6. 用javascript 写个函数返回一个页面里共使用了多少种HTML 标签

    今天我无意间看到一个面试题: 如何用javascript 写个函数返回一个页面里共使用了多少种HTML 标签? 不知你看到 是否蒙B了,如果是我 面试,肯定脑子嗡嗡的响.... 网上搜了搜也没有找到答 ...

  7. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...

  8. Discuz NT 架构剖析之Config机制

    接触了Discuz NT! 一段时间了,是时候做个总结了,标题好霸气,有木有? 都是托园子里的大牛代振军的福啊,哈哈哈哈. 首先论坛的信息不是完全存储在数据库里面的,一部分信息存储在config文件里 ...

  9. css3线条围绕跑马+jquery打字机效果

    原文地址:css3线条围绕跑马+jquery打字机效果 有图有真相,今天偶然看到了一种效果,仔细看了下,发现它是用css的clip+css3的动画实现的,简直叼.于是自己拿来了前一阵子写的打字机效果, ...

  10. 【Linux大系】Linux的概念与体系

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 我在这一系列文章中阐述Linux的基 本概念.Linux操作系统继承自UNIX.一个操作系统是一套控制和使用计算 ...