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 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦


