RabbitMQ使用及与spring boot整合

2024-09-09 04:58

本文主要是介绍RabbitMQ使用及与spring boot整合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.MQ

  消息队列(Message Queue,简称MQ)——应用程序和应用程序之间的通信方法

  应用:不同进程Process/线程Thread之间通信

  比较流行的中间件:

    ActiveMQ

    RabbitMQ(非常重量级,更适合于企业级的开发)

    Kafka(高吞吐量的分布式发布订阅消息系统)

    RocketMQ

  在高并发、可靠性、成熟度等方面,RabbitMQ是首选

  Kafka的性能(吞吐量、TPS)比RabbitMq要高出来很多,但Kafka主要定位在日志方面,如果业务方面还是建议选择RabbitMq

2.AMQP

  Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计

  主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全

3.RabbitMQ

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写

支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX

用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗

(1)安装

  需要先安装Erlang ,再安装RabbitMQ

  环境:win7

  Erlang

    下载 :

      https://www.erlang-solutions.com/resources/download.html 

    安装:

      双击下载的文件(esl-erlang_22.1~windows_amd64.exe) ,下一步进行安装

    安装完后开始菜单多了

      

  RabbitMQ

    下载 :

      https://www.rabbitmq.com/download.html

    安装:

      双击下载的文件(rabbitmq-server-3.8.1.exe) ,下一步进行安装

    安装完后开始菜单多了

      

     选择开始菜单的RabbitMQ Command Prompt(sbin dir)

     

    进入C:\Program Files (x86)\RabbitMQ Server\rabbitmq_server-3.4.1\sbin输入命令

rabbitmq-plugins enable rabbitmq_management

启动了管理工具

服务启动  net start RabbitMQ
服务停止  net stop RabbitMQ

服务启动后,浏览器打开http://localhost:15672/

使用账号 guest ,密码 guest

能够登录,安装成功

(2)用户管理

  Admin选项卡

  A.添加用户

用户角色:

    超级管理员(administrator)

    监控者(monitoring)

      策略制定者(policymaker)

    普通管理者(management)

    其他

  B.创建Virtual Hosts

   C.设置权限

   选中Admin用户,进入权限设置

 

   已添加权限

 (3)spring boot整合RabbitMQ

  添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>2.2.1.RELEASE</version>
</dependency>

  添加配置

 

#对于rabbitMQ的支持
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtual-host=testhost
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.publisher-returns=true

 

  添加RabbitMQ配置类


package com.example.demo.configure;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMqConfig {public static final String RABBITMQ_QUEUE_NAME = "Queue1";public static final String RABBITMQ_ORDER_QUEUE_NAME = "OrderQueue1";private final static Logger logger = LoggerFactory.getLogger(RabbitMqConfig.class);@Autowiredprivate CachingConnectionFactory cachingConnectionFactory;@Beanpublic Queue commonQueue() {return new Queue(RabbitMqConfig.RABBITMQ_QUEUE_NAME);}@Beanpublic Queue orderQueue() {return new Queue(RabbitMqConfig.RABBITMQ_ORDER_QUEUE_NAME);}@Beanpublic DirectExchange directExchange() {return new DirectExchange("directExchange");}@Beanpublic TopicExchange topicExchange() {return new TopicExchange("topicExchange");}@Beanpublic FanoutExchange fanoutExchange() {return new FanoutExchange("fanoutExchange");}// 建立Queue与Exchange的绑定关系@Beanpublic Binding bindingExchangeMessage(Queue orderQueue, DirectExchange directExchange) {return BindingBuilder.bind(orderQueue).to(directExchange).with(RabbitMqConfig.RABBITMQ_ORDER_QUEUE_NAME);}@Beanpublic RabbitTemplate rabbitTemplate() {cachingConnectionFactory.setPublisherConfirms(true);cachingConnectionFactory.setPublisherReturns(true);RabbitTemplate rabbitTemplate = new RabbitTemplate(cachingConnectionFactory);rabbitTemplate.setMandatory(true);rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {if (ack)logger.info("消息发送成功: correlationData:({}),ack:({ack}),cause:({})", correlationData,ack, cause);elselogger.info("消息发送失败: correlationData:({}),ack:({ack}),cause:({})", correlationData,ack, cause);});rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> logger.info("消息丢失:exchange({}),route({}),replyCode({}),replyText({}),message:{}", exchange,routingKey, replyCode, replyText, message));return rabbitTemplate;}
}package

 

  生产者


package com.example.demo.mq;import com.example.demo.configure.RabbitMqConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class OrderMaker {private final static Logger logger = LoggerFactory.getLogger(OrderMaker.class);@Autowiredprivate RabbitTemplate rabbitTemplate;public void send(String content){this.rabbitTemplate.convertAndSend(RabbitMqConfig.RABBITMQ_ORDER_QUEUE_NAME,content);}
}package

 

  测试入口


package com.example.demo.controller;import com.example.demo.mq.OrderMaker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
public class Demo {@Autowiredprivate OrderMaker orderMaker;@RequestMapping(value = "/testMq",method = RequestMethod.GET,produces = MediaType.ALL_VALUE)public String testMq(String msg){orderMaker.send(msg);System.out.println(msg);return "Successfully.";}
}package

 

  使用postman测试http://127.0.0.1:8080/testMq?msg=hahaha,this is a test

  在http://localhost:15672中

  OrderQueue1队列有两条消息

  查看消息

 

    消费者


package com.example.demo.mq;import com.example.demo.configure.RabbitMqConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@RabbitListener(queues = RabbitMqConfig.RABBITMQ_ORDER_QUEUE_NAME)
public class OrderListener {private final static Logger logger = LoggerFactory.getLogger(OrderListener.class);@RabbitHandlerpublic void process(String orderMsg){logger.info("订单消费者收到消息:" + orderMsg);}
}package

 

  重新启动

  log输出

2019-11-13 14:36:51.500 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  com.example.demo.mq.OrderListener - 订单消费者收到消息:hahaha,this is a test
2019-11-13 14:36:51.516 [AMQP Connection 127.0.0.1:5672] INFO  com.example.demo.configure.RabbitMqConfig - 消息发送成功: correlationData:(null),ack:({ack}),cause:(true)

这样就实现了简单的队列,生产者将消息发送到队列,消费者从队列中获取消息

P:消息的生产者
C:消息的消费者
红色:队列

 

这篇关于RabbitMQ使用及与spring boot整合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150219

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF