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

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

相关推荐
橙子圆1238 小时前
RabbitMQ知识1
分布式·rabbitmq
無a伟2 天前
RabbitMq高级特性:TTL,死信队列,延迟队列
java·分布式·rabbitmq
小楼昨夜又东风1262 天前
kafka、rocketmq、rabbitmq,有什么区别
kafka·rabbitmq·rocketmq
無a伟2 天前
RabbitMq高级特性:消息确认,持久化,重试机制
java·分布式·rabbitmq
星云API技术支持4 天前
企业微信二次开发:如何建立统一的错误处理、日志与请求追踪机制
javascript·企业微信·ruby
Cry丶4 天前
第四篇:Block、Proc、Lambda 与 `yield`
ruby·lambda·block·yield·闭包·proc
Dreams_l5 天前
如何保证RabbitMQ消息可靠传输
java·rabbitmq·java-rabbitmq
额鹅恶饿呃6 天前
随着CentOS官方停服的时间越来越久,大量仍在使用CentOS7的企业和运维从业者
java·python·算法·c#·ruby
专注仿真7 天前
RabbitMQ消息队列实战项目
数据结构·rabbitmq
Dreams_l7 天前
RabbitMQ在SpringBoot中的应用
spring boot·rabbitmq·java-rabbitmq