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 : 消费者用了、但是没有告诉交换机、就是未确认的状态

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

相关推荐
笨蛋不要掉眼泪9 小时前
RabbitMQ消息队列:SpringAMQP
java·分布式·rabbitmq
笨蛋不要掉眼泪11 小时前
RabbitMQ消息队列:交换机机制
java·分布式·rabbitmq
重庆小透明1 天前
带你从不同视角了解三大MQ
java·学习·spring·kafka·rabbitmq·rocketmq
晚安code1 天前
RabbitMQ消息可靠性:发送确认、消费者ACK与SpringAMQP实战
rabbitmq
L1624761 天前
消息队列(MQ)总览:RabbitMQ & Kafka 完整手册
分布式·kafka·rabbitmq
刘小八1 天前
RabbitMQ 消息积压排查:从指标定位到消费者扩容
分布式·rabbitmq
小罗水2 天前
第9章 RabbitMQ 消息队列与索引任务
分布式·rabbitmq
乱七八糟的屋子3 天前
AMQP C++ 超详细实战教程(amqp-cpp 开源库从零入门到生产落地)
c++·rabbitmq·任务队列·amqp·流量削峰·c++服务端异步解耦·分布式消息通信
余—笙4 天前
Docker安装rabbitmq并安装延迟队列插件
docker·容器·rabbitmq
17715574314 天前
Mac 上 Ruby、gem、rvm、CocoaPods 四者关系通俗讲清楚
macos·ruby·cocoapods