本系列是学习SpringBoot整合RabbitMQ的练手,包含服务安装,RabbitMQ整合SpringBoot2.x,消息可靠性投递实现等三篇博客。

  学习路径:https://www.imooc.com/learn/1042 RabbitMQ消息中间件极速入门与实战

  项目源码:https://github.com/ZbLeaning/Boot-RabbitMQ


整合实际上主要两步:

  1、引入相关依赖

  2、对application.yml进行配置

注意:后续需要使用数据库,因此需要安装mysql。https://blog.csdn.net/qq_37719778/article/details/81298292  mysql安装教程

Spring.RabbitMQ配置的含义可参考:https://blog.csdn.net/en_joker/article/details/80103519

数据库建表语句:

  1. DROP TABLE IF EXISTS `broker_message_log`;
  2. CREATE TABLE `broker_message_log` (
  3. `message_id` varchar(255) NOT NULL COMMENT '消息唯一ID',
  4. `message` varchar(4000) NOT NULL COMMENT '消息内容',
  5. `try_count` int(4) DEFAULT '0' COMMENT '重试次数',
  6. `status` varchar(10) DEFAULT '' COMMENT '消息投递状态 0投递中,1投递成功,2投递失败',
  7. `next_retry` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '下一次重试时间',
  8. `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
  9. `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
  10. PRIMARY KEY (`message_id`)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  12.  
  13. -- ----------------------------
  14. -- Table structure for t_order
  15. -- ----------------------------
  16. DROP TABLE IF EXISTS `t_order`;
  17. CREATE TABLE `t_order` (
  18. `id` int(11) NOT NULL AUTO_INCREMENT,
  19. `name` varchar(255) DEFAULT NULL,
  20. `message_id` varchar(255) DEFAULT NULL,
  21. PRIMARY KEY (`id`)
  22. ) ENGINE=InnoDB AUTO_INCREMENT=2018091102 DEFAULT CHARSET=utf8;

完成前期准备后开始进行整合。


 Producer:服务端

  1、新建一个SpringBoot项目,项目结构如下

  2、添加Pom.xml文件依赖

  1. <!--rabbitmq依赖-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-amqp</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.mybatis.spring.boot</groupId>
  12. <artifactId>mybatis-boot-starter</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>tk.mybatis</groupId>
  16. <artifactId>mapper-spring-boot-starter</artifactId>
  17. <version>1.1.0</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>com.alibaba</groupId>
  21. <artifactId>druid</artifactId>
  22. <version>1.0.29</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>com.github.miemiedev</groupId>
  26. <artifactId>mybatis-paginator</artifactId>
  27. <version>1.2.17</version>
  28. <exclusions>
  29. <exclusion>
  30. <groupId>org.mybatis</groupId>
  31. <artifactId>mybatis</artifactId>
  32. </exclusion>
  33. </exclusions>
  34. </dependency>
  35. <!--工具类依赖包-->
  36. <dependency>
  37. <groupId>org.apache-commons</groupId>
  38. <artifactId>commons-lang3</artifactId>
  39. </dependency>
  40. <dependency>
  41. <groupId>commons-io</groupId>
  42. <artifactId>commons-io</artifactId>
  43. <version>2.4</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>com.alibaba</groupId>
  47. <artifactId>fastjson</artifactId>
  48. <version>1.2.49</version>
  49. </dependency>
  50. <dependency>
  51. <groupId>javax.servlet</groupId>
  52. <artifactId>javax.servlet-api</artifactId>
  53. <scope>provided</scope>
  54. </dependency>
  55. <dependency>
  56. <groupId>log4j</groupId>
  57. <artifactId>log4j</artifactId>
  58. <version>1.2.17</version>
  59. </dependency>

  3、配置application.yml文件

  1. spring:
  2. rabbitmq:
  3. addresses: 134.175.33.221:5672
  4. username: guest
  5. password: guest
  6. virtual-host: /
  7. ##开启Publisher Confirm机制
  8. publisher-confirms: true
  9. ##开启Publisher Return机制
  10. publisher-returns: true
  11. template:
  12. mandatory: true
  13. datasource:
  14. url: jdbc:mysql://localhost:3306/rabbitmq?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
  15. username: root
  16. password: binzhang
  17. driverClassName: com.mysql.jdbc.Driver
  18. type: com.alibaba.druid.pool.DruidDataSource
  19. server:
  20. port: 8001
  21. servlet:
  22. context-path: /
  23. mybatis:
  24. mapper-locations: classpath:mapping/*.xml
  25. logging:
  26. level:
  27. tk:
  28. mybatis: trace

  4、编写消息发送类,直接使用SpringBoot配置的RabbitTemplate模板

  1. import com.imooc.mq.entity.Order;
  2. import org.springframework.amqp.rabbit.connection.CorrelationData;
  3. import org.springframework.amqp.rabbit.core.RabbitTemplate;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Component;
  6.  
  7. /**
  8. * @Title: OrderSender
  9. * @Description: 订单发送
  10. * @date 2019/1/2210:20
  11. */
  12. @Component
  13. public class OrderSender {
  14. //使用rabbitmq模板
  15. @Autowired
  16. private RabbitTemplate rabbitTemplate;
  17.    //发送消息
  18. public void sendOrder(Order order) throws Exception{
  19.      
  20. CorrelationData correlationData = new CorrelationData();
  21. correlationData.setId(order.getMessageId());
  22.  
  23. rabbitTemplate.convertAndSend("order-exchange",//exchange
  24. "order.abcd",//routingKey
  25. order,//消息体内容
  26. correlationData); //消息唯一id
  27. }
  28. }

  5、通过控制面板手动建立交换机exchange、消息队列queue

  6、点击进入创建好的order-exchange,设置绑定路由键

  7、写测试demo,运行消息发现,看控制台是否收到消息

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class MqApplicationTests {
  4. @Autowired
  5. private OrderSender orderSender;
  6.  
  7. @Test
  8. public void contextLoads() {
  9. Order order = new Order();
  10. order.setId("aaa");
  11. order.setName("测试消息a");
  12. order.setMessageId(System.currentTimeMillis() + "$" + UUID.randomUUID().toString());
  13. try {
  14. orderSender.sendOrder(order);
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. }
  19.  
  20. }

  接收消息成功:

  

  注意:启动时如果报异常

  1. Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

  则需要配置

  1. @MapperScan("com.imooc.mq.mapper") @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

 Consumer:消费端 

  1、项目结构

  2、配置Pom.xml文件,引入依赖,可直接复制服务端pom.xml注入的依赖

  3、配置Application.xml文件

  1. ## springboot整合rabbitmq的基本配置
  2. spring:
  3. rabbitmq:
  4. addresses: 134.175.33.221:5672
  5. username: guest
  6. password: guest
  7. ##连接到RabbitMQ的虚拟主机
  8. virtual-host: /
  9. ## 消费端配置
  10. listener:
  11. simple:
  12. ##消费者的最小数量
  13. concurrency: 5
  14. ## manual:手动 ack(确认)
  15. acknowledge-mode: manual
  16. ##消费者的最大数量
  17. max-concurrency: 10
  18. ##在单个请求中处理的消息个数,应该大于等于事务数量
  19. prefetch: 1
  20. datasource:
  21. url: jdbc:mysql://localhost:3306/rabbitmq?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
  22. username: root
  23. password: binzhang
  24. driverClassName: com.mysql.jdbc.Driver
  25. server:
  26. port: 8002
  27. servlet:
  28. context-path: /

  4、需要将服务端的Order类也复制到消费端

  5、编写消息接收类

  1. import com.imooc.mq.entity.Order;
  2. import com.rabbitmq.client.Channel;
  3. import org.springframework.amqp.rabbit.annotation.*;
  4. import org.springframework.amqp.support.AmqpHeaders;
  5. import org.springframework.messaging.handler.annotation.Headers;
  6. import org.springframework.messaging.handler.annotation.Payload;
  7. import org.springframework.stereotype.Component;
  8.  
  9. import java.util.Map;
  10.  
  11. /**
  12. * @Title: OrderReceiver
  13. * @Description: 消费
  14. * @date 2019/1/2211:03
  15. */
  16. @Component
  17. public class OrderReceiver {
  18. /**
  19. * @RabbitListener 消息监听,可配置交换机、队列、路由key
  20. * 该注解会创建队列和交互机 并建立绑定关系
  21. * @RabbitHandler 标识此方法如果有消息过来,消费者要调用这个方法
  22. * @Payload 消息体
  23. * @Headers 消息头
  24. * @param order
  25. */
  26. @RabbitListener(bindings = @QueueBinding(
  27. value = @Queue(value = "order-queue",declare = "true"),
  28. exchange = @Exchange(name = "order-exchange",declare = "true",type = "topic"),
  29. key = "order.abcd"
  30. ))
  31. @RabbitHandler
  32. public void onOrderMessage(@Payload Order order, @Headers Map<String,Object> headers,
  33. Channel channel) throws Exception{
  34. //消费者操作
  35. System.out.println("------收到消息,开始消费------");
  36. System.out.println("订单ID:"+order.getId());
  37.  
  38. Long deliveryTag = (Long)headers.get(AmqpHeaders.DELIVERY_TAG);
  39. //现在是手动确认消息 ACK
  40. channel.basicAck(deliveryTag,false);
  41. }
  42. }

  6、运行成功后

 

基本的服务和消费端整合及演示demo已完成,一般开发过程中我们大都采用手动确认消息机制,如果注释掉该行则会出现消息被消费但是一直处于未被确认的状态。当重启服务端再次发现消息时,消息也会被消费。

SpringBoot整合RabbitMQ-整合演示的更多相关文章

  1. 消息中间件——RabbitMQ(十)RabbitMQ整合SpringBoot实战!(全)

    前言 1. SpringBoot整合配置详解 publisher-confirms,实现一个监听器用于监听Broker端给我们返回的确认请求:RabbitTemplate.ConfirmCallbac ...

  2. 一篇学习完rabbitmq基础知识,springboot整合rabbitmq

    一   rabbitmq 介绍 MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced MessageQueue 高级消息队列协议 ...

  3. SpringBoot消息篇Ⅲ --- 整合RabbitMQ

    知识储备:  关于消息队列的基本概念我已经在上一篇文章介绍过了(传送门),本篇文章主要讲述的是SpringBoot与RabbitMQ的整合以及简单的使用. 一.安装RabbitMQ 1.在linux上 ...

  4. RabbitMQ和SpringBoot的简单整合列子

    一 思路总结 1 主要用spring-boot-starter-amqp来整合RabbitMQ和SpringBoot 2 使用spring-boot-starter-test来进行单元测试 3编写配置 ...

  5. java框架之SpringBoot(12)-消息及整合RabbitMQ

    前言 概述 大多数应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦的能力. 消息服务中两个重要概念:消息代理(message broker)和目的地(destination).当消息发送者发送 ...

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

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

  7. springboot学习笔记-6 springboot整合RabbitMQ

    一 RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿 ...

  8. 【SpringBoot系列5】SpringBoot整合RabbitMQ

    前言: 因为项目需要用到RabbitMQ,前几天就看了看RabbitMQ的知识,记录下SpringBoot整合RabbitMQ的过程. 给出两个网址: RabbitMQ官方教程:http://www. ...

  9. SpringBoot系列八:SpringBoot整合消息服务(SpringBoot 整合 ActiveMQ、SpringBoot 整合 RabbitMQ、SpringBoot 整合 Kafka)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 整合消息服务 2.具体内容 对于异步消息组件在实际的应用之中会有两类: · JMS:代表作就是 ...

随机推荐

  1. 用CSS画小猪佩奇,你就是下一个社会人!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:江志耿 | 腾讯TEG网络工程师 我是佩奇,哼,这是我的弟弟乔治,呱呱,这是我的妈妈,嚯,这是我的爸爸,嚯~ 背景 小猪佩奇已经火了好 ...

  2. jmeter使用csv进行参数化(二)

    上篇说的是csv的第一种方法进行参数化,这篇说第二种方法. 重新打开录制好的脚本. 1.提取函数变量 打开选项--函数助手对话框 设置对话框参数: 选择csvread,然后将变量文件的路径填写进来.添 ...

  3. selenium提供的截图功能

    get_screenshot_as_file()提供一个截屏功能.在自动化执行过程中,执行失败后只能看到代码的运行错误,而不能直接看到ui上的错误,利用截屏保存下来很容易的进行问题的判断 先来执行一个 ...

  4. Volley 图片加载相关源码解析

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47721631: 本文出自:[张鸿洋的博客] 一 概述 最近在完善图片加载方面的 ...

  5. 运维监控利器Nagios之:nagios配置详解

    http://ixdba.blog.51cto.com/2895551/752870 一.nagios配置过程详解 1.nagios默认配置文件介绍  nagios安装完毕后,默认的配置文件在/usr ...

  6. linux释放内存的命令

    释放cache: sync echo 3>/proc/sys/vm/drop_caches 释放swap: sync swapoff -a swapon -a 版权声明:本文为博主原创文章,未经 ...

  7. Linux上配置使用iSCSI详细说明

    本文详细介绍iSCSI相关的内容,以及在Linux上如何实现iSCSI. 第1章 iSCSI简介 1.1 scsi和iscsi 传统的SCSI技术是存储设备最基本的标准协议,但通常需要设备互相靠近并用 ...

  8. java8中stream的map和flatmap的理解

    转自https://blog.csdn.net/wynjauu/article/details/78741093 假如我们有这样一个需求给定单词列表["Hello","W ...

  9. Sql函数笔记一、case when

    Case具有两种格式.简单Case函数和Case搜索函数. 简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END   ...

  10. Elasticsearch笔记二之Curl工具基本操作

    Elasticsearch笔记二之Curl工具基本操作 简介: Curl工具是一种可以在命令行访问url的工具,支持get和post请求方式.-X指定http请求的方法,-d指定要传输的数据. 创建索 ...