消息中间件RabbitMq简单使用
测试截图
Unacked 消息,代表消息已经投递给消费者
Ready消息,代表消息已发送,消费者未接受
每次都是想学个东西,找了一堆教程没一个能用,等自己写好教程了,结果搜到一堆能用的教程真是头大,坑爹啊
linux服务器安装rabbitmq
安装rabbitmq需要的文件汇总,https://yourheart.live/upload/2023/07/o8ldjj84vgih9p1ia7d5nh289o.7z
3.9.15版本的mq,下载地址https://yourheart.live/upload/2023/07/1jf90plt66h9oojhv6tm4scppb.zip
知道了地址,可以使用linux命令下载到服务器并解压
1 2 3 4 | 下载 wget https: //yourheart.live/upload/2023/07/1jf90plt66h9oojhv6tm4scppb.zip 解压 unzip 1jf90plt66h9oojhv6tm4scppb.zip |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | yum install socat https: //github.com/rabbitmq/erlang-rpm/releases/download/v23.0.2/erlang-23.0.2-1.el7.x86_64.rpm rpm -ivh erlang- 23.0 . 2 - 1 .el7.x86_64.rpm https: //github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.5/rabbitmq-server-3.8.5-1.el7.noarch.rpm rpm -ivh rabbitmq-server- 3.8 . 5 - 1 .el7.noarch.rpm 1 .启用RabbitMQ的管理插件 rabbitmq-plugins enable rabbitmq_management 2 .开启RabbitMQ 后台启动 systemctl start rabbitmq-server 非后台启动 rabbitmq-server 3 .停止rabbitmq systemctl stop rabbitmq-server 4 .添加用户 rabbitmqctl add_user root 123456 5 .给用户添加权限 给root用户在虚拟主机 "/" 上的配置、写、读的权限 rabbitmqctl set_permissions root -p / ".*" ".*" ".*" 6 .给用户设置标签 rabbitmqctl set_user_tags root administrator |
页面登录使用15672端口,地址:15672
用户名 root
密码 123456
构建生产者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | <?xml version= "1.0" encoding= "UTF-8" ?> <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion> 4.0 . 0 </modelVersion> <groupId>com.java</groupId> <artifactId>rabbitmq-service</artifactId> <packaging>pom</packaging> <version> 1.0 -SNAPSHOT</version> <modules> <module>rabbitmq-consumer</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version> 2.5 . 7 </version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <java.version> 1.8 </java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit-test</artifactId> <scope>test</scope> </dependency> <!--引入junit单元测试依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version> 4.12 </version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
1 2 3 4 5 6 | server.port= 15670 spring.rabbitmq.test.host= 127.0 . 0.1 spring.rabbitmq.test.port= 5672 spring.rabbitmq.test.username=xx spring.rabbitmq.test.password=xx |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | package com.java; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author yourheart * @Description 消息的生产者 * @create 2022-05-24 14:34 */ @SpringBootApplication public class RabbitMqApplication { public static void main(String[] args) { SpringApplication.run(RabbitMqApplication. class ,args); } } package com.java.config; /** * @author yourheart * @Description * @create 2022-05-24 23:03 */ import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.Exchange; import org.springframework.amqp.core.ExchangeBuilder; import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.QueueBuilder; import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * RabbitMQ配置类 */ @Configuration public class RabbitMQConfig { //交换机名称 public static final String ITEM_TOPIC_EXCHANGE = "item_topic_exchange" ; //队列名称 public static final String ITEM_QUEUE = "item_queue" ; //声明交换机 @Bean ( "itemTopicExchange" ) public Exchange topicExchange(){ return ExchangeBuilder.topicExchange(ITEM_TOPIC_EXCHANGE).durable( true ).build(); } //声明队列 @Bean ( "itemQueue" ) public Queue itemQueue(){ return QueueBuilder.durable(ITEM_QUEUE).build(); } //绑定队列和交换机 @Bean public Binding itemQueueExchange( @Qualifier ( "itemQueue" ) Queue queue, @Qualifier ( "itemTopicExchange" ) Exchange exchange){ return BindingBuilder.bind(queue).to(exchange).with( "item.#" ).noargs(); } @Bean public ConnectionFactory connectionFactory() throws Exception { //创建工厂类 CachingConnectionFactory cachingConnectionFactory= new CachingConnectionFactory(); //用户名 cachingConnectionFactory.setUsername( "xx" ); //密码 cachingConnectionFactory.setPassword( "xx" ); //rabbitMQ地址 cachingConnectionFactory.setHost( "127.0.0.1" ); //rabbitMQ端口 cachingConnectionFactory.setPort( 5672 ); cachingConnectionFactory.setCacheMode(CachingConnectionFactory.CacheMode.CHANNEL); return cachingConnectionFactory; } /** * 将配置好的信息放入 * @param connectionFactory * @return */ @Bean public RabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory){ SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); return factory; } /** * 自动声明队列 * @param connectionFactory * @return */ @Bean public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){ RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); rabbitAdmin.setAutoStartup( true ); return rabbitAdmin; } } |
使用自定义线程池制造数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | package com.java; import com.java.config.RabbitMQConfig; import org.junit.Test; import org.junit.runner.RunWith; 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.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * @author yourheart * @Description * @create 2022-06-25 21:54 */ @RunWith (SpringRunner. class ) @SpringBootTest public class RabbitmqThread { private final static Logger log= LoggerFactory.getLogger(RabbitmqThread. class ); @Autowired private RabbitTemplate rabbitTemplate; @Test public void test001(){ //核心线程数 int corePoolSize = 3 ; //最大线程数 int maximumPoolSize = 16 ; //超过 corePoolSize 线程数量的线程最大空闲时间 long keepAliveTime = 2 ; //以秒为时间单位 TimeUnit unit = TimeUnit.SECONDS; //创建工作队列,用于存放提交的等待执行任务 BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>( 2 ); ThreadPoolExecutor threadPoolExecutor = null ; try { //创建线程池 threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, new ThreadPoolExecutor.AbortPolicy()); //循环提交任务 for ( int i = 0 ; i < 18 ; i++) { //提交任务的索引 final int index = (i + 1 ); threadPoolExecutor.submit(() -> { //线程打印输出 log.info( "大家好,我是线程:{}" ,index); String key= "item.springboot-rabbitmq" ; String msg= "rabbitmq发送消息99999999" ; log.info( "【发送消息】msg:{}" ,msg); rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_TOPIC_EXCHANGE ,key ,msg); try { //模拟线程执行时间,10s Thread.sleep( 10000 ); } catch (InterruptedException e) { e.printStackTrace(); } }); //每个任务提交后休眠500ms再提交下一个任务,用于保证提交顺序 Thread.sleep( 500 ); } } catch (InterruptedException e) { e.printStackTrace(); } finally { threadPoolExecutor.shutdown(); } } } |
构建消费者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version= "1.0" encoding= "UTF-8" ?> <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <parent> <artifactId>rabbitmq-service</artifactId> <groupId>com.java</groupId> <version> 1.0 -SNAPSHOT</version> </parent> <modelVersion> 4.0 . 0 </modelVersion> <artifactId>rabbitmq-consumer</artifactId> </project> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | package com.java; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author yourheart * @Description * @create 2022-05-25 22:07 */ @SpringBootApplication public class RabbitMqConsumerApplication { public static void main(String[] args) { SpringApplication.run(RabbitMqConsumerApplication. class ,args); } } package com.java.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * @author yourheart * @Description * @create 2022-05-25 22:09 */ @Component public class HelloController { private final static Logger log= LoggerFactory.getLogger(HelloController. class ); @RabbitListener (queues = "item_queue" ) public void service(String messgae){ try { Thread.sleep(0L); } catch (InterruptedException e) { e.printStackTrace(); } log.info( "【消息队列推送过来的数据】message:{}" ,messgae); } } |
1 2 3 4 5 6 | server.port= 15671 spring.rabbitmq.host= 127.0 . 0.1 spring.rabbitmq.port= 5672 spring.rabbitmq.username=xx spring.rabbitmq.password=xx |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异