Java (Springboot)操作 RabbitMq 入门学习笔记

RabbitMq 安装使用教程(Windows)学习参考 csdn 大佬博客
【Windows安装RabbitMQ详细教程】

RabbitMq 详细概念及基于Java的基本操作 学习参考 Bilibili 视频教程,2倍速观看加实操记笔记等大概需要1整天 时间(本人前后花了3天)
【涛哥】最适合小白入门的RabbitMQ教程

RabbitMq 的逻辑结构(组成部分)

1,用户(Users)
可以设置用户级别(角色),用于登录管理平台、在java操作rabbitMq的时候用于建立连接;

2,虚拟主机(virtual-host)
相当于mysql数据库中的库,先建库,再建表;虚拟主机需要设置用户权限,让用户有权限使用这个虚拟主机

3,队列(Queues)
队列是建在 指定虚拟主机下的,相当于mysql 中的表;

4,交换机(ExChanges)
交换机是建在 指定虚拟主机下的,有2种类型的交换机 direct(路由形式) 和 fanout(订阅形式);交换机下需要绑定队列;

操作步骤(均可在管理后台内进行操作):
1,创建用户(非必要,内置管理员(登录管理平台)用户guest/guest)
2,创建虚拟主机;
3,创建队列;
4,创建交换机(交换机绑定队列)

RabbitMq 的工作模式

rabbitMq 提供了多种消息的通信方式
消息通信是由两个角色完成:消息生产者(producer)和消息消费者(Consumer)

  • 简单模式:(生产者将消息发送到队列)
    一个队列只有一个消费者;
    生产者将消息发送到队列,消费者从队列取出数据;

  • 工作模式:(生产者将消息发送到队列)
    多个消费者监听同一个队列;
    多个消费者监听同一个队列,但多个消费者中只有一个消费者会成功消费消息;

  • 订阅模式:(生产者将消息发送到交换机)
    生产者将消息发往交换机,交换机在把消息发送到自身绑定的所有的队列,相当于群发;

  • 路由模式:(生产者将消息发送到交换机)
    生产者将消息发往交换机的时候可以指定一个Key(key 对应一个队列),再由交换机发往自身绑定的队列中的指定的队列;

基于Java (Maven项目)实现基本的消息发布与消费

1,导入Maven 依赖;

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>4.10.0</version>
</dependency>

2,编写连接工具类;

/**
 * rabbitMq 建立连接工具类
 */
public class MqUtil {

    public static Connection getConnection() throws IOException, TimeoutException {
        //连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //服务Ip
        factory.setHost("127.0.0.1");
        //端口
        factory.setPort(5672);
        //虚拟主机(相当于连接 mysql 指定数据库)
        factory.setVirtualHost("v-host1");
        //用户名
        factory.setUsername("wwf");
        //密码
        factory.setPassword("admin123");
        //通过工厂创建连接
        Connection connection = factory.newConnection();
        return connection;
    }
}

3,编写消息的生产者;

public class SendMsg2 {
    public static void main(String[] args) throws Exception {
        //需要发送的消息
        String msg = "hello world!";
        //通过工具类获得rabbitMq 连接
        Connection connection = MqUtil.getConnection();
        //创建通道
        Channel channel = connection.createChannel();
        /**
         * 创建队列;【XXX一般不会在代码中进行创建XXX】
         * 参数1:定义队列名称;
         * 参数2:队列中的数据是否持久化
         * 参数3:是否排外(当前队列是否由当前连接私有)
         * 参数4:自动删除(当前队列连接数为0时自动删除队列,无论队列中是否有数据)
         * 参数5: 设置当前队列的参数
         *
         */
        //channel.queueDeclare("v-host1-queue5",false,false,false,null);

        /**
         *  发送消息:
         * 参数1:交换机名称,如果直接发送消息到队列,则交换机名称为 ""
         * 参数2:目标队列名称
         * 参数3:设置当前消息的属性(可设置过期时间 10)
         * 参数4:消息的内容
         */
        //1>>> 直接发送消息到指定队列【队列 v-host1-queue1 会收到消息】
        channel.basicPublish("","v-host1-queue1",null,msg.getBytes());

        //2>>> 发送消息到交换机 fanout 订阅模式【 交换机exchange1 下绑定的队列都会收到消息】
//        channel.basicPublish("exchange1","",null,msg.getBytes());

        //3>>> 发送消息到交换机 direct 路由模式【 交换机exchange3 下绑定的队列中设置的 key 为“key5” 的这个队列会收到消息 】
//        channel.basicPublish("exchange3","key5",null,msg.getBytes());

        System.out.println("发送消息:》》"+msg);
        //关闭连接
        connection.close();
    }
}

4,编写消息的消费者;

public class RecMsg {
    public static void main(String[] args) throws IOException, TimeoutException {
        //通过工具类获取连接
        Connection connection = MqUtil.getConnection();
        //建立通道
        Channel channel = connection.createChannel();
        //获取消息
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //super.handleDelivery(consumerTag, envelope, properties, body);
                String msg = new String(body);
                System.out.println("消费者接受到的消息》》:"+msg);

            }
        };
        channel.basicConsume("v-host1-queue1",true,consumer);
        
        
    }
}

使用 SpringBoot 整合使用RabbitMq

1,添加Maven 依赖

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

2,application.yml 配置文件内添加配置;

server:
  port: 8085
spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    virtual-host: v-host1
    username: wwf
    password: admin123

3,编写消息生产者;

@Service
public class SendService {

    @Autowired
    private AmqpTemplate amqpTemplate;

    public void sendMsg(String msg){
        if(Objects.isNull(msg)){
            System.out.println("消息为空!!");
            return;
        }
        //简单模式
        if(msg.startsWith("v")){
            amqpTemplate.convertAndSend("v-host1-queue5",msg);
        //工作模式
        }else if(msg.startsWith("w")){
            amqpTemplate.convertAndSend("v-host1-queue5",msg);
        //订阅模式
        }else if(msg.startsWith("f")){
            amqpTemplate.convertAndSend("exchange1","",msg);
        //路由模式
        }else{
            if(msg.startsWith("a")){
                if("aaa".equals(msg)){
                    amqpTemplate.convertAndSend("exchange2","aaa",msg);
                }else {
                    amqpTemplate.convertAndSend("exchange2","key7",msg);
                }
            }else {
                amqpTemplate.convertAndSend("exchange2","key8",msg);
            }

        }

    }

}

4,编写消息消费者;

@Service
//可以同时消费多个队列,但是正常一个消费者只消费一个队列。除非多个队列做的事是一样的
@RabbitListener(queues = {"q7"})
public class ConsumerMqService {

    //字符串
    @RabbitHandler
    public void resMsg(String msg){
        System.out.println("q7接受到的消息》》》:"+msg);
    }

    //字节数组
//    @RabbitHandler
//    public void resMsgByte(byte[] msg){
//        System.out.println("接受到的消息》》》:"+new String(msg));
//    }
    

}

2022-12-31 00:30
待补充…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值