本系列是学习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

数据库建表语句:

DROP TABLE IF EXISTS `broker_message_log`;
CREATE TABLE `broker_message_log` (`message_id` varchar(255) NOT NULL COMMENT '消息唯一ID',`message` varchar(4000) NOT NULL COMMENT '消息内容',`try_count`int(4) DEFAULT '0' COMMENT '重试次数',`status` varchar(10) DEFAULT '' COMMENT '消息投递状态 0投递中,1投递成功,2投递失败',`next_retry` timestamp NOT NULL DEFAULT'0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '下一次重试时间',`create_time` timestamp NOT NULL DEFAULT'0000-00-00 00:00:00'ON UPDATE CURRENT_TIMESTAMP,`update_time` timestamp NOT NULL DEFAULT'0000-00-00 00:00:00'ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`message_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Table structure fort_order-- ----------------------------DROP TABLE IF EXISTS `t_order`;
CREATE TABLE `t_order` (`id`int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`message_id` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2018091102 DEFAULT CHARSET=utf8;

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


 Producer:服务端

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

  2、添加Pom.xml文件依赖

 <!--rabbitmq依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-boot-starter</artifactId></dependency><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>1.1.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.29</version></dependency><dependency><groupId>com.github.miemiedev</groupId><artifactId>mybatis-paginator</artifactId><version>1.2.17</version><exclusions><exclusion><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></exclusion></exclusions></dependency><!--工具类依赖包--><dependency><groupId>org.apache-commons</groupId><artifactId>commons-lang3</artifactId></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.49</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><scope>provided</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

  3、配置application.yml文件

spring:rabbitmq:addresses:134.175.33.221:5672username: guestpassword: guestvirtual-host: /##开启Publisher Confirm机制publisher-confirms: true##开启Publisher Return机制publisher-returns: truetemplate:mandatory:truedatasource:url: jdbc:mysql://localhost:3306/rabbitmq?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username: rootpassword: binzhangdriverClassName: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource
server:port:8001servlet:context-path: /mybatis:mapper-locations: classpath:mapping/*.xmllogging:level:tk:mybatis: trace

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

importcom.imooc.mq.entity.Order;importorg.springframework.amqp.rabbit.connection.CorrelationData;importorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;/*** @Title: OrderSender* @Description: 订单发送* @date 2019/1/2210:20*/@Componentpublic classOrderSender {//使用rabbitmq模板
@AutowiredprivateRabbitTemplate rabbitTemplate;//发送消息public void sendOrder(Order order) throwsException{CorrelationData correlationData= newCorrelationData();correlationData.setId(order.getMessageId());rabbitTemplate.convertAndSend("order-exchange",//exchange"order.abcd",//routingKeyorder,//消息体内容correlationData); //消息唯一id
}
}

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

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

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

@RunWith(SpringRunner.class)
@SpringBootTestpublic classMqApplicationTests {@AutowiredprivateOrderSender orderSender;@Testpublic voidcontextLoads() {Order order= newOrder();order.setId("aaa");order.setName("测试消息a");order.setMessageId(System.currentTimeMillis()+ "$" +UUID.randomUUID().toString());try{orderSender.sendOrder(order);}catch(Exception e) {e.printStackTrace();}}}

  接收消息成功:

  

  注意:启动时如果报异常

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

  则需要配置

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


 Consumer:消费端 

  1、项目结构

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

  3、配置Application.xml文件

## springboot整合rabbitmq的基本配置
spring:rabbitmq:addresses:134.175.33.221:5672username: guestpassword: guest##连接到RabbitMQ的虚拟主机virtual-host: /## 消费端配置listener:simple:##消费者的最小数量concurrency:5## manual:手动 ack(确认)acknowledge-mode: manual##消费者的最大数量max-concurrency: 10##在单个请求中处理的消息个数,应该大于等于事务数量prefetch:1datasource:url: jdbc:mysql://localhost:3306/rabbitmq?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username: rootpassword: binzhangdriverClassName: com.mysql.jdbc.Driver
server:port:8002servlet:context-path: /

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

  5、编写消息接收类

importcom.imooc.mq.entity.Order;importcom.rabbitmq.client.Channel;import org.springframework.amqp.rabbit.annotation.*;importorg.springframework.amqp.support.AmqpHeaders;importorg.springframework.messaging.handler.annotation.Headers;importorg.springframework.messaging.handler.annotation.Payload;importorg.springframework.stereotype.Component;importjava.util.Map;/*** @Title: OrderReceiver* @Description: 消费* @date 2019/1/2211:03*/@Componentpublic classOrderReceiver {/*** @RabbitListener 消息监听,可配置交换机、队列、路由key* 该注解会创建队列和交互机 并建立绑定关系* @RabbitHandler 标识此方法如果有消息过来,消费者要调用这个方法* @Payload 消息体* @Headers 消息头*@paramorder*/@RabbitListener(bindings=@QueueBinding(value= @Queue(value = "order-queue",declare = "true"),exchange= @Exchange(name = "order-exchange",declare = "true",type = "topic"),key= "order.abcd"))@RabbitHandlerpublic void onOrderMessage(@Payload Order order, @Headers Map<String,Object>headers,Channel channel)throwsException{//消费者操作System.out.println("------收到消息,开始消费------");System.out.println("订单ID:"+order.getId());Long deliveryTag=(Long)headers.get(AmqpHeaders.DELIVERY_TAG);//现在是手动确认消息 ACKchannel.basicAck(deliveryTag,false);}
}

  6、运行成功后

 

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

转载于:https://www.cnblogs.com/zhangbLearn/p/10302920.html

SpringBoot整合RabbitMQ-整合演示相关推荐

  1. 【分布式】SpirngBoot 整合RabbitMQ、Exchagne模式、确认消费

    分布式 内容管理 SpringBoot 整合RabbitMQ 整合过程 多种消息模型 --- Exchange调度策略 Fanout 订阅 .广播模式 ---- 适用于 业务数据需要广播场景: 用户操 ...

  2. (三)Spring整合RabbitMQSpringBoot 整合RabbitMQRabbitMQ 镜像队列

    Spring整合RabbitMQ: SpringBoot 整合RabbitMQ: RabbitMQ 镜像队列:(待补充) ------------------------------- Spring整 ...

  3. RabbitMQ,RabbitMQ 的工作模式,Spring 整合 RabbitMQ,Springboot 整合RabbitMQ

    什么是RabbitMQ 1.1 MQ概述 MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器.多用于分布式系统之间进行通信. ⚫ MQ,消息队列,存储消息的中间件 ⚫ ...

  4. SpringBoot整合RabbitMq实战(一)

    1 Spring AMQP 简介 Spring AMQP项目是一个引入Spring核心概念用于基于高级消息队列(AMQP)的解决方案的开发,它提供了一个模板用于发送和接受消息的高级抽象.它对基于消息驱 ...

  5. SpringBoot b2b2c 多用户商城系统(十五)Springboot整合RabbitMQ...

    这篇文章带你了解怎么整合RabbitMQ服务器,并且通过它怎么去发送和接收消息.我将构建一个springboot工程,通过RabbitTemplate去通过MessageListenerAdapter ...

  6. SpringBoot第十五篇:Springboot整合RabbitMQ

    这篇文章带你了解怎么整合RabbitMQ服务器,并且通过它怎么去发送和接收消息.我将构建一个springboot工程,通过RabbitTemplate去通过MessageListenerAdapter ...

  7. RabbitMQ(八):SpringBoot 整合 RabbitMQ(三种消息确认机制以及消费端限流)

    说明 本文 SpringBoot 与 RabbitMQ 进行整合的时候,包含了三种消息的确认模式,如果查询详细的确认模式设置,请阅读:RabbitMQ的三种消息确认模式 同时消费端也采取了限流的措施, ...

  8. 九、springboot整合rabbitMQ

    springboot整合rabbitMQ 简介 rabbitMQ是部署最广泛的开源消息代理. rabbitMQ轻量级,易于在内部和云中部署. 它支持多种消息传递协议. RabbitMQ可以部署在分布式 ...

  9. (十五)java B2B2C 多级Springboot多租户电子商城系统 Springboot整合RabbitMQ

    Spring cloud b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.这篇文章带你了解怎么整合RabbitMQ服务器,并且通过它怎么去发送和接收消息.我将构建一个springbo ...

最新文章

  1. pygame简单的俄罗斯方块游戏和简单的打字游戏
  2. python项目-python项目
  3. TX Text Control文字处理教程
  4. 【笔记】windows10安装linux(ubuntu)双系统教程(可能是现今最简单方法)
  5. 解决UbuntuE: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系
  6. 通俗易懂!白话朴素贝叶斯
  7. 动态分配的const对象
  8. java lambda表达式_凯哥带你从零学大数据系列之Java篇---第二十二章:Lambda表达式...
  9. Apsara Stack 技术百科 | 边缘场景智能云化,让云无处不在
  10. Java编译的运行机制初步讲解
  11. MATLAB中的max函数的用法及含义
  12. php网上商城拟解决的问题是,上次说的软件商城BUG,已找到问题,并解决~
  13. flex-builder编译方法
  14. log4j 日志书写格式_Log4J日志配置详解
  15. Java根据出生日期判断星座
  16. 魔客吧php登录界面模板,精仿魔客吧网站模板discuz模板_带VIP购买等多个插件
  17. 关于阿里云主机数据丢失问题,是常态还是个例?如何保障数据安全?...
  18. 使用java生成mapbox-gl可读的vector tile
  19. java输出格林威治时间,Java之格林威治时间格式转换成北京时间格式
  20. ipad如何找到.开头的隐藏文件夹

热门文章

  1. 阿里云服务器(Ubuntu16.04 64位)远程连接
  2. Python程序设计题解【蓝桥杯官网题库】 DAY6-基础练习
  3. 免费使用谷歌GPU训练神经网络
  4. c语言编程软件出现问号,【C语言】if语句和问号表达式
  5. 9适应之力加多少攻击_NBA球星生涯最低分都是多少?詹皇碰上麦迪仅得3分,哈登最低1分...
  6. 网络推广产品浅析网站SEO文章更新要注意哪些因素?
  7. OPPO Find X3通过网站推广正式官宣,打破常规探索高端旗舰新突破!
  8. 网络推广外包运营浅析美的成立科技公司旨在依靠科技创新实现突破
  9. 企业网络推广专员浅析企业网络推广初期网站优化应重视的一些问题
  10. android listview 不显示_ListView详细介绍与使用