rabbitmq之Java-channel

本文详细介绍了RabbitMQ中的关键概念和技术细节,包括交换器声明、基本QoS设置、消息发布、确认机制、消费消息、绑定操作等,并解释了如何配置持久化和可靠性策略。
声明交换器:
Exchange.DeclareOk exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete,
                                       Map<String, Object> arguments) throws IOException;


exchange:交换器名称

type:交换器类型:direct、fanout、topic

durable:true:服务器重启会保留下来交换器。注意:仅设置此选项,不代表消息持久化。既不保证重启后消息还在。

autoDelete: true:当已经没有消费者时,服务器是否可以删除该交换器。


void basicQos(int prefetchSize, int prefetchCount, boolean global) throws IOException;

prefetchSize:0 
prefetchCount:会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ack,则该consumer将block掉,直到有消息ack
global:true\false 是否将上面设置应用于channel,简单点说,就是上面限制是channel级别的还是consumer级别
备注:据说prefetchSize 和global这两项,rabbitmq没有实现,暂且不研究

void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body)
            throws IOException;

exchange:交换器

routingKey:路由键,#匹配0个或多个单词,*匹配一个单词,在topic exchange做消息转发用

mandatory(托管):true如果exchange根据自身类型和消息routkey无法找到一个符合条件的queue,那么调用basic.return方法将消息返还给生产者。false:出现上述情形broker会直接将消息扔掉

immediate(立即的):如果exchange在将消息route到queue时发现对应的queue上没有消费者,那么这条消息不会放入队列中。当与消息routekey关联的所有queue(一个或多个)都没有消费者时,该消息会通过basic.return方法返还给生产者。

BasicProperties:需要注意的是BasicProperties.deliveryMode,0:不持久化,1:持久化  这里指的是消息的持久化,配合channel(durable=true),queue(durable)可以实现,及时服务器宕机,消息仍保留。

简单来说:mandatory标志告诉服务器至少将该消息route到一个队列中,否则将消息返还给生产者immediate标志告诉服务器如果消息关联的queue上有消费者,则马上将消息投递给它,如果所有queue都没有消费者,直接把消息返还给生产者,不用将消息如队列等待消费者了。

void basicAck(long deliveryTag, boolean multiple) throws IOException;

deliveryTag:该消息的index

multiple:是否批量。true:将一次性ack所有小于deliveryTag的消息

void basicNack(long deliveryTag, boolean multiple, boolean requeue)
            throws IOException;

deliveryTag:该消息index

multiple:是否批量。true将一次性拒绝所有小于deliveryTag的消息

requeue:被拒绝的是否重新如队列。


void basicReject(long deliveryTag, boolean requeue) throws IOException;

deliveryTag:该消息的index

requeue:被拒绝的是否重新入队列

channel.basicNack与channel.basicReject的区别在于前者可以拒绝多条消息,而后者一次只能拒绝一条消息。


String basicConsume(String queue, boolean autoAck, Consumer callback) throws IOException;

queue:队列名称

autoAck:是否自动ack,如果不自动ack,需要使用channel.ack、channel.nack、channel.basicReject进行消息应答

Exchange.BindOk exchangeBind(String destination, String source, String routingKey) throws IOException;

destination:队列名

source:交换器名

routingKey:路由键

Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
                                 Map<String, Object> arguments) throws IOException;

queue:队列名

durable(持久化):true在服务器重启时,能够存活

exclusive:是否为当前连接的专用队列,在连接断开后,会自动删除该队列。

autodelete:当没有任何消费者使用时,自动删除队列。


### 关于 GitHub 用户 javaer2333 的 RabbitMQ Java 客户端仓库 #### 仓库概述 GitHub 上由用户 `javaer2333` 维护的 `rabbitmq-java-client` 是一个用于与 RabbitMQ 进行交互的 Java 库。该库提供了创建生产者和消费者所需的功能,支持 AMQP 协议,并且可以方便地集成到基于 Java 的应用程序中[^1]。 #### 主要功能特性 - **消息发送**:允许开发者通过简单的 API 调用来向 RabbitMQ 队列发布消息。 - **消息接收**:提供监听器接口来处理来自队列的消息。 - **连接管理**:简化了与 RabbitMQ Server 建立和断开 TCP/IP 连接的过程。 - **事务支持**:确保数据传输的一致性和可靠性。 - **异常处理机制**:内置错误恢复逻辑以增强系统的健壮性。 #### 使用示例 下面是一个基本的例子展示了如何利用此客户端库实现消息生产和消费: ```java // 生产者代码片段 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) { String queueName = "hello"; // 发布一条新消息至指定队列 channel.basicPublish("", queueName, null, "Hello World!".getBytes()); } catch (IOException | TimeoutException e) { System.err.println(e.getMessage()); } ``` ```java // 消费者代码片段 public class ReceiveLogs implements Runnable { private final static String QUEUE_NAME = "logQueue"; @Override public void run() { try { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) { DeliverCallback deliverCallback = (consumerTag, delivery) -> { String message = new String(delivery.getBody(), StandardCharsets.UTF_8); System.out.println("Received '" + message + "'"); }; // 开始异步等待并处理消息 channel.queueDeclare(QUEUE_NAME, false, false, true, null); channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {}); } } catch (IOException | TimeoutException e) { throw new RuntimeException(e); } } public static
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值