RabbitMQ简单用法

ConnectionFactory

ConnectionFactory类是RabbitMQ Java客户端库中的一个类,用于创建RabbitMQ连接。常用属性和方法如下:

属性:

java 复制代码
- host:RabbitMQ服务器的主机名,默认为localhost。
- port:RabbitMQ服务器的端口号,默认为5672。
- username:连接RabbitMQ服务器的用户名,默认为guest。
- password:连接RabbitMQ服务器的密码,默认为guest。
- virtualHost:连接RabbitMQ服务器的虚拟主机,默认为/。
- connectionTimeout:连接超时时间,默认为0(无限制)。
- requestedHeartbeat:请求的心跳超时时间,默认为0(无限制)。

方法:

java 复制代码
- newConnection():创建一个新的RabbitMQ连接。
- createChannel():创建一个新的通道。

Channel

Channel类的常用方法包括:

java 复制代码
1. basicPublish:用于将消息发送到指定的交换机和路由键。
	参数含义:
	- exchange:消息发送到的交换机名称
	- routingKey:消息发送到的队列名称
	- props:消息的属性
	- body:消息体
	作用:将消息发送到指定的交换机上,等待被消费者消费。

2. basicConsume:用于从指定队列中消费消息。
	 参数含义:
	- queue:要消费的队列名称
	- autoAck:是否自动确认消息
	- callback:消费者接收到消息后的回调函数
	作用:订阅队列中的消息,等待被消费者消费。

3. basicAck:用于确认已经处理完毕的消息。
	参数含义:
	- deliveryTag:消息标签
	- multiple:是否批量确认
	作用:确认消息已被消费,告诉RabbitMQ可以删除该消息。
	
4. basicNack:用于拒绝处理某个消息,并可以选择是否重新将消息放回队列。
	参数含义:
	- deliveryTag:消息标签
	- multiple:是否批量拒绝
	- requeue:是否重新入队列
	作用:拒绝消息,并可选择是否重新入队列。

5. basicReject:用于拒绝处理某个消息,并可以选择是否重新将消息放回队列。
	参数含义:
	- deliveryTag:消息标签
	- requeue:是否重新入队列
	作用:拒绝消息,并重新入队列。

6. queueDeclare:用于声明一个队列。
	参数含义:
	- queue:队列名称
	- durable:是否持久化
	- exclusive:是否独占
	- autoDelete:是否自动删除
	- arguments:队列参数
	作用:声明队列,如果队列不存在则创建。

7 exchangeDeclare:用于声明一个交换机。
	参数含义:
	- exchange:交换机名称
	- type:交换机类型
	- durable:是否持久化
	- autoDelete:是否自动删除
	- internal:是否内部使用
	- arguments:交换机参数
	作用:声明交换机,如果交换机不存在则创建。

8. queueBind:用于将队列绑定到指定的交换机和路由键。
	参数含义:
	- queue:队列名称
	- exchange:交换机名称
	- routingKey:路由键
	- arguments:绑定参数
	作用:将队列绑定到交换机上,等待被消费者消费。

Channel类的作用是提供了与RabbitMQ服务器进行通信的通道,通过该通道可以进行消息的发送和接收,以及队列和交换机的声明和绑定等操作。同时,Channel类还提供了一些方法用于控制消息的确认和拒绝,以及消息的持久化等高级特性。

DefaultConsumer

DefaultConsumer是RabbitMQ客户端库中的一个类,它实现了Consumer接口,用于处理从RabbitMQ服务器接收到的消息。

DefaultConsumer类的常用方法包括:

java 复制代码
1. handleDelivery:处理从RabbitMQ服务器接收到的消息。
	void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException;
	参数含义:
	- consumerTag:消费者标签,用于标识消费者。
	- envelope:消息的信封,包含了消息的元数据,如交换机、路由键等。
	- properties:消息的属性,包含了消息的元数据,如消息ID、消息类型等。
	- body:消息的内容,即消息体。

2. handleShutdownSignal:处理与RabbitMQ服务器的连接关闭信号。
	void handleShutdownSignal(String consumerTag, ShutdownSignalException sig);
	参数含义:
	- consumerTag:消费者标签,用于标识消费者。
	- sig:关闭信号异常,包含了关闭的原因和异常信息。
	
3. handleConsumeOk:处理与RabbitMQ服务器的消费者注册成功信号。
	void handleConsumeOk(String consumerTag);
	参数含义:
	- consumerTag:消费者标签,用于标识消费者。
	
4. handleCancelOk:处理与RabbitMQ服务器的消费者取消注册成功信号。
	void handleCancelOk(String consumerTag);
	参数含义:
	- consumerTag:消费者标签,用于标识消费者。

在handleDelivery方法中,我们可以根据需要对消息进行处理,例如解析消息内容、存储消息等。

生产者示例代码

创建RabbitMQ连接、创建通道、声明交换机和发送消息的完整示例代码:

java 复制代码
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class RabbitMQExample {
    private static final String QUEUE_NAME = "my_queue";
    private static final String EXCHANGE_NAME = "my_exchange";
    private static final String ROUTING_KEY = "my_routing_key";

    public static void main(String[] args) {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");

        try {
            // 创建连接
            Connection connection = factory.newConnection();

            // 创建通道
            Channel channel = connection.createChannel();

            // 声明交换机
            channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);

            // 发送消息
            String message = "Hello, RabbitMQ!";
            channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, message.getBytes());
            System.out.println("Sent message: " + message);

            // 关闭通道和连接
            channel.close();
            connection.close();
        } catch (IOException | TimeoutException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,使用了默认的本地RabbitMQ服务器,用户名和密码都是"guest",虚拟主机是"/"。创建了一个名为"my_exchange"的topic类型交换机,并发送了一条消息到该交换机上,使用了"my_routing_key"作为路由键。

消费者示例代码

创建RabbitMQ连接、创建通道、声明交换机、以及接收消息:

java 复制代码
import com.rabbitmq.client.*;

public class RabbitMQExample {
    private final static String QUEUE_NAME = "my_queue";
    private final static String EXCHANGE_NAME = "my_exchange";
    private final static String ROUTING_KEY = "my_routing_key";

    public static void main(String[] args) throws Exception {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");

        // 创建连接
        Connection connection = factory.newConnection();

        // 创建通道
        Channel channel = connection.createChannel();

        // 声明交换机
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);

        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        // 绑定队列到交换机
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);

        // 创建消费者
        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println("Received message: " + message);
            }
        };

        // 开始消费消息
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }
}

以上示例代码演示了如何创建一个RabbitMQ连接、创建通道、声明一个类型为TOPIC的交换机、以及接收消息的过程。你可以根据自己的需求修改相关参数和逻辑。

相关推荐
来一杯龙舌兰12 小时前
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
分布式·rabbitmq·ruby·持久化·ack·消息确认
Allen Bright1 天前
Spring Boot 整合 RabbitMQ:从入门到实践
spring boot·rabbitmq·java-rabbitmq
bug_null1 天前
RabbitMQ消息可靠性保证机制7--可靠性分析-rabbitmq_tracing插件
分布式·rabbitmq
kingbal1 天前
RabbitMQ:添加virtualHost
分布式·rabbitmq
04Koi.2 天前
Java项目--仿RabbitMQ的消息队列--虚拟主机设计
分布式·rabbitmq
04Koi.2 天前
Java项目--仿RabbitMQ的消息队列--网络通信协议设计
分布式·rabbitmq
大饼酥2 天前
保姆级教程Docker部署RabbitMQ镜像
docker·容器·rabbitmq
Code apprenticeship2 天前
RabbitMQ如何实现延时队列?
分布式·rabbitmq
04Koi.3 天前
Java项目--仿RabbitMQ的消息队列--消息持久化
分布式·rabbitmq
一名技术极客3 天前
RabbitMQ实现网络分区
网络·分布式·rabbitmq