通常情况下,为了提高系统开发的灵活性和可维护度,我们会采用消息队列队系统进行解耦。下面是一个采用spring redis实现的消息队列实例,但此实例会由于网络延迟和阻塞等情况导致消息处理的延时,因而不能确保消息处理的顺序,所以使用时需要注意。

  • pom.xml中添加如下配置

添加版本配置

  1. <properties>
  2. <jedis.version>2.8.1</jedis.version>
  3. <spring-data-redis.version>1.7.2.RELEASE</spring-data-redis.version>
  4. <commons-pool2.version>2.2</commons-pool2.version>
  5. </properties>
  1. <!-- jedis -->
  2. <dependency>
  3. <groupId>redis.clients</groupId>
  4. <artifactId>jedis</artifactId>
  5. <version>${jedis.version}</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.commons</groupId>
  9. <artifactId>commons-pool2</artifactId>
  10. <version>${commons-pool2.version}</version>
  11. </dependency>
  12. <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
  13. <dependency>
  14. <groupId>org.springframework.data</groupId>
  15. <artifactId>spring-data-redis</artifactId>
  16. <version>${spring-data-redis.version}</version>
  17. </dependency>
  • properties文件中添加如下配置
  1. #redis配置
  2. redis.host=192.168.1.150
  3. redis.port=6379
  4. redis.password=redis
  5. redis.timeout=2000
  6. redis.max_total=100
  7. redis.max_idle=20
  8. redis.min_idle=5
  9. redis.test_on_borrow=true
  10. redis.test_on_return=true
  • applicationContext.xml中添加如下配置:
  1. <!-- Jedis 连接池配置-->
  2. <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
  3. <property name="maxIdle" value="${redis.max_idle}" />
  4. <property name="maxTotal" value="${redis.max_total}"/>
  5. <property name="minIdle" value="${redis.min_idle}"/>
  6. <property name="testOnBorrow" value="${redis.test_on_borrow}" />
  7. <property name="testOnReturn" value="${redis.test_on_return}"/>
  8. </bean>
  9. <!-- Jedis ConnectionFactory 数据库连接配置,注意id名称必须为redisConnectionFactory-->
  10. <bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
  11. <property name="hostName" value="${redis.host}" />
  12. <property name="port" value="${redis.port}" />
  13. <property name="password" value="${redis.password}" />
  14. <property name="poolConfig" ref="jedisPoolConfig" />
  15. </bean>
  • 定义消息发送者(生产者):
  1. @Component
  2. public class SendMessage {
  3. @Autowired
  4. private RedisTemplate<String, Object> redisTemplate;
  5. public void sendMessage(String channel, Serializable message) {
  6. redisTemplate.convertAndSend(channel, message);
  7. }
  8. }
  • 定义消息处理者(消费者):
  1. public class ListenMessage {
  2. public void handleMessage(Serializable message){
  3. System.out.println(message);
  4. }
  5. }
  • 调用:/queue/redis
  1. @Controller
  2. @RequestMapping(value = "/queue")
  3. public class QueueController {
  4. @Autowired
  5. SendMessage sendMessage;
  6. @RequestMapping(value="/redis")
  7. public void redis(){
  8. for (int i = 0; i <1000; i++) {
  9. sendMessage.sendMessage("java",i);
  10. }
  11. }
  12. }
  • 新建applicationContext-redis.xml,内容如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:redis="http://www.springframework.org/schema/redis"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/redis http://www.springframework.org/schema/redis/spring-redis.xsd">
  5. <!--创建redis模板-->
  6. <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
  7. <property name="connectionFactory" ref="redisConnectionFactory"/>
  8. </bean>
  9. <!--序列化-->
  10. <bean id="jdkSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
  11. <!--消息监听处理类-->
  12. <bean id="messageDelegateListener" class="com.quartz.task.core.queue.ListenMessage"/>
  13. <bean id="messageListener" class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter">
  14. <property name="delegate" ref="messageDelegateListener"/>
  15. <property name="serializer" ref="jdkSerializer" />
  16. </bean>
  17. <!--消息监听-->
  18. <redis:listener-container>
  19. <!--指定消息处理方法,序列化方式及主题名称-->
  20. <redis:listener ref="messageListener" method="handleMessage" serializer="jdkSerializer" topic="java"/>
  21. </redis:listener-container>
  22. </beans>
  • 目录结构
  1. E:.

  2. ├─src
  3. └─main
  4. ├─java
  5. └─com
  6. └─quartz
  7. └─task

  8. ├─controller
  9. QueueController.java

  10. ├─core
  11. ├─queue
  12. ListenMessage.java
  13. SendMessage.java

  14. ├─resources
  15. applicationContext-redis.xml
  16. applicationContext.xml
  17. springMVC-context.xml
  18. system-config.properties

  19. └─webapp
  20. index.jsp

  21. └─WEB-INF
  22. web.xml

  23. ├─resources
  24. └─view
  25. index.jsp

spring mvc redis消息队列的更多相关文章

  1. java-spring基于redis单机版(redisTemplate)实现的分布式锁+redis消息队列,可用于秒杀,定时器,高并发,抢购

    此教程不涉及整合spring整合redis,可另行查阅资料教程. 代码: RedisLock package com.cashloan.analytics.utils; import org.slf4 ...

  2. redis消息队列简单应用

    消息队列出现的原因 随着互联网的高速发展,门户网站.视频直播.电商领域等web应用中,高并发.大数据已经成为基本的标识.淘宝双11.京东618.各种抢购.秒杀活动.以及12306的春运抢票等,他们这些 ...

  3. logstash解耦之redis消息队列

    logstash解耦之redis消息队列 架构图如下: 说明:通过input收集日志消息放入消息队列服务中(redis,MSMQ.Resque.ActiveMQ,RabbitMQ),再通过output ...

  4. 预热一下吧《实现Redis消息队列》

    应用场景 为什么要用redis?二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成ja ...

  5. Redis 消息队列的实现

    概述 Redis实现消息队列有两种形式: 广播订阅模式:基于Redis的 Pub/Sub 机制,一旦有客户端往某个key里面 publish一个消息,所有subscribe的客户端都会触发事件 集群订 ...

  6. 【转】redis 消息队列发布订阅模式spring boot实现

    最近做项目的时候写到一个事件推送的场景.之前的实现方式是起job一直查询数据库,看看有没有最新的消息.这种方式非常的不优雅,反正我是不能忍,由于羡慕本身就依赖redis,刚好redis 也有消息队列的 ...

  7. Spring整合ActiveMq消息队列

    ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久 ...

  8. (转)java redis使用之利用jedis实现redis消息队列

    应用场景 最近在公司做项目,需要对聊天内容进行存储,考虑到数据库查询的IO连接数高.连接频繁的因素,决定利用缓存做. 从网上了解到redis可以对所有的内容进行二进制的存储,而java是可以对所有对象 ...

  9. Redis笔记(七)Java实现Redis消息队列

    这里我使用Redis的发布.订阅功能实现简单的消息队列,基本的命令有publish.subscribe等. 在Jedis中,有对应的java方法,但是只能发布字符串消息.为了传输对象,需要将对象进行序 ...

随机推荐

  1. 格雷码原理与Verilog实现

    格雷码原理 格雷码是一个叫弗兰克*格雷的人在1953年发明的,最初用于通信.格雷码是一种循环二进制码或者叫作反射二进制码.格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点 ...

  2. dockerRegistry搭建

    docker registry安装: 官方仓库下载registry     pull镜像: fu@ubuntu:~$ sudo docker pull registry    运行镜像 : sudo ...

  3. Jquery揭秘系列:实现 ready和bind事件

    讲这一节之前,先回顾之前的一篇<小谈Jquery>里面的代码: (function (win) { var _$ = function (selector, context) { retu ...

  4. 51Nod-1136 欧拉函数

    51Nod: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1136 1136 欧拉函数 基准时间限制:1 秒 空间限制: ...

  5. 【Python】[面向对象编程] 访问限制,继承和多态

    1.在Python中两个下划线__ 就是带便私有属性 private   注意已两个下划线开头并且结尾的 如 __init__ 是特殊变量,不是私有变量 2.多态,Python的“file-like ...

  6. 介绍DSA数字签名,非对称加密的另一种实现

    接下来我们介绍DSA数字签名,非对称加密的另一种实现. DSA DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS ...

  7. thinkphp上传

    上传代码 // 缩略图上传 $upload = new \Think\Upload();// 实例化上传类 $upload->maxSize = ;// 设置附件上传大小 $upload-> ...

  8. safari浏览器在window下 打开控制台

    有时候需要在window下测试safari浏览器的兼容性 然后需要打开错误控制台 以下是完整打开的图文教程 1.显示菜单栏 2.打开偏好设置 3.然后切换到高级标签 勾选 在菜单栏显示开发菜单 4.打 ...

  9. mysql GET DIAGNOSTICS 语法

    MySQL 5.6 提供了 get diagnostic 语句来获取错误缓冲区的内容,然后把这些内容输出到不同范围域的变量里,以便我们后续灵活操作 语法如下: GET [CURRENT] DIAGNO ...

  10. iOS开发网络篇—数据缓存

      iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...