docker安装RabbitMQ
1.拉取rabbitmq镜像
docker search rabbitmq docker pull rabbitmq
2.search timeout问题,能正常pull的小伙伴请忽略此步骤
现在使用docker search可能会存在timeout的问题。还好其他服务器有rabbitmq镜像,我就直接移植过来了。如果没有rabbitmq镜像的小伙伴可以通过Docker Desktop下载(需要魔法),或者通过这个链接下载:
https://pan.baidu.com/s/1OEUWq1Z1FjZYIbk494JxIw 提取码: r2c5 复制这段内容后打开百度网盘手机App,操作更方便哦
移植镜像相关命令
#导出镜像 docker save -o rabbitmq.tar rabbitmq:management #导入镜像 docker load -i rabbitmq.tar #查看镜像 docker images
3.创建和启动容器
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5673:5672 rabbitmq
-d 后台运行容器; --name 指定容器名; -p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号); --hostname 主机名;
4.进入容器
docker ps #替换成本地的容器ID docker exec -it c7ae7c9d8781 /bin/bash #启动管理端 rabbitmq-plugins enable rabbitmq_management
5.访问rabbitmq,http://ip:15672,默认账户密码:guest/guest
Spring 集成RabbitMQ
1.引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
2.添加配置
spring: rabbitmq: username: guest password: guest #rabbitmq host host: 192.168.1.157 port: 5672
3.直连型交换机模式(Direct Exchange)
直连型交换机模式就是根据消息携带的路由键将消息投递给对应队列。
大致流程,有一个队列绑定到一个直连交换机上,同时赋予一个路由键 routing key 。
然后当一个消息携带着路由值为X,这个消息通过生产者发送给交换机时,交换机就会根据这个路由值X去寻找绑定值也是X的队列。
4.定义枚举QueueName
我为了方便管理,将队列、路由、和交换机名称都定义在一个枚举里面。
import lombok.Getter; @Getter public enum QueueName { DefaultQueue("defaultQueue","default","default"), TaskMsgQueue("taskMsgQueue","taskMsg","taskMsg"); private final String name; private final String routingKey; private final String exchange; QueueName(String name,String routingKey,String exchange) { this.name = name; this.routingKey = routingKey; this.exchange = exchange; } }
5.配置队列QueueConfig
import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class QueueConfig { @Bean public DirectExchange defaultExchange() { return new DirectExchange(QueueName.DefaultQueue.getExchange()); } @Bean public DirectExchange taskMsgExchange() { return new DirectExchange(QueueName.TaskMsgQueue.getExchange()); } @Bean public Queue taskMsgQueue() { return new Queue(QueueName.TaskMsgQueue.getName(), true); } @Bean public Binding taskMsgQueueBinding(){ return BindingBuilder.bind(taskMsgQueue()) .to(taskMsgExchange()) .with(QueueName.TaskMsgQueue.getRoutingKey()); } }
6.定义消息结构
import lombok.Data; import lombok.ToString; import java.io.Serializable; @Data @ToString public class TaskMsgSendVo implements Serializable { private static final long serialVersionUID = 1L; private String priKey; private String unionTaskId; private String type; }
7.生产者和消费者
import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * @author will_ */ @Slf4j @Component public class ProducerService { @Resource private RabbitTemplate rabbitTemplate; public void sendTaskMsg(TaskMsgSendVo taskMsgSendVo){ log.info("send task msg:{}",taskMsgSendVo); this.rabbitTemplate.convertAndSend(QueueName.TaskMsgQueue.getExchange(),QueueName.TaskMsgQueue.getRoutingKey(), taskMsgSendVo); } }
import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component @Slf4j public class MsgConsumer { @RabbitListener(queues = "taskMsgQueue") public void receiveTaskMsg(TaskMsgSendVo vo) { log.info("receive task msg:{}",vo); } }
8.测试
public void testProduceMsg(String priKey, String type) { var taskMsgVo = new TaskMsgSendVo(); taskMsgVo.setPriKey(priKey); taskMsgVo.setType(type); taskMsgVo.setUnionTaskId(UUID.randomUUID().toString()); producerService.sendTaskMsg(taskMsgVo); }
启动项目,开始测试。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦