为了账号安全,请及时绑定邮箱和手机立即绑定

Docker 安装RabbitMQ + Spring集成

标签:
Docker Spring
  • 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

https://img1.sycdn.imooc.com/6784d8920802200118430131.jpg

    5.访问rabbitmq,http://ip:15672,默认账户密码:guest/guest

https://img1.sycdn.imooc.com/6784d94f0867a63f13920450.jpg

  • 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);
}

启动项目,开始测试。

https://img1.sycdn.imooc.com/6785c8b708d056c917700256.jpg




点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消