RabbitMQ消息模型之Simple消息模型

simple消息模型

生产者
java 复制代码
package com.example.demo02.mq.simple;

import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;

/**
 * @author Allen
 * 4/10/2024 8:07 PM
 * @version 1.0
 * @description: 简单模型-生产者
 */
public class SimpleSender {
    public static void main(String[] args) throws Exception {
        // 1、创建连接
        Connection connection = ConnectionUtils.getConnection();
        // 2、创建通道
        Channel channel = connection.createChannel();
        // 3、声明队列:队列可以缓存数据、mq的交换机不能存储数据 simple模型使用的是默认交换机
        // 参数1:队列名称 参数2:是否持久化 参数3:是否排他性 参数4:是否自动删除 参数5:其他属性
        channel.queueDeclare("simple_queue", false, false, false, null);
        // 4、发送消息:发送到队列中
        // 在simple模型中   参数1:交换机 参数2:队列名称 参数3:传递消息额外设置 参数4:消息的具体内容(任意数据类型)
        String msg = "hello rabbitmq";
        channel.basicPublish("", "simple_queue", null, msg.getBytes());
        // 5、关闭通道
        channel.close();
        // 6、关闭连接
        connection.close();
    }
}
消费者
java 复制代码
package com.example.demo02.mq.simple;

import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @author Allen
 * 4/10/2024 8:59 PM
 * @version 1.0
 * @description: 简单模型-消费者
 */
public class SimpleReciver {
    public static void main(String[] args) throws Exception {
        // 1、创建连接
        Connection connection = ConnectionUtils.getConnection();
        // 2、创建通道
        Channel channel = connection.createChannel();
        // 3、声明队列:如果已声明可以忽略
        // 4、监听队列:
        channel.queueDeclare("simple_queue", false, false, false, null);
        Consumer consumer = new DefaultConsumer(channel){
            // 消息的具体处理逻辑
            // 消费者接收到消息后调用此方法
            // 如果AutoAck为true,此方法一旦被调用,消息会被确认
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消费者接收到消息:"+new String(body));
                /*
                channel.basicReject();    //拒绝消息,可以丢弃消息,也可以重新入队
                channel.basicNack();      //不确认消息,可以设置是否重新入队
                */
                channel.basicAck(envelope.getDeliveryTag(),false);         //手动确认消息,参数1:消息的标识,参数2:是否开启多个消息同时确认
            }
        };
/*        参数1:队列名称 参数2:是否自动确认 参数3:消费者
        队列名称:消费哪个队列的消息
        AutoAck:是否自动确认,如果为true,表示消息一旦被接收,自动向mq回复接收到,mq会删除消息,如果为false,需要手动确认,如果消费者挂掉,消息会被重回队列
        Consumer:消费者对象
        channel.basicConsume("simple_queue", true,consumer);
        避免消息丢失,手动确认
*/
        channel.basicConsume("simple_queue", false,consumer);

    }
}

Unacked : 消费者用了、但是没有告诉交换机、就是未确认的状态

当消息被消费了,且告诉交换机了,交换机就会将这个消息删除

相关推荐
java1234_小锋1 小时前
Java高频面试题:RabbitMQ中有哪几种交换机类型?
java·rabbitmq·java-rabbitmq
空空潍2 小时前
RabbitMQ高级(2w字笔记)
java·rabbitmq·java-rabbitmq
爱学习的小可爱卢3 小时前
RabbitMQ—消息元数据解析指南
后端·rabbitmq
薛定谔之死猫1 天前
Ruby简单粗暴把图片合成PDF文档
java·pdf·ruby
SoleMotive.1 天前
rabbitmq消息堆积怎么处理?
分布式·rabbitmq
聪明人1 天前
RabbitMQ HAProxy 负载均衡
rabbitmq·负载均衡·ruby
2401_848009722 天前
rabbitmq的高级知识-ttl与死信队列
分布式·rabbitmq·java-rabbitmq
luom01022 天前
使用 Docker 部署 RabbitMQ 的详细指南
docker·容器·rabbitmq
zzz84152 天前
集成RabbitMQ+MQ常用操作
分布式·rabbitmq
龙门吹雪2 天前
消息队列RabbitMQ的配置操作及使用
分布式·rabbitmq