rabbitmq 手动提交_springboot集成rabbitmq并手动注册容器实现单个queue的ack模式

进入正题,本文会介绍两种实现rabbitmq的ack模式的方法,分别为:

一、通过配置文件配置。

二、通过手动注册 SimpleMessageListenerContainer容器实现。

先介绍方法一:

通过配置文件配置。

此类实现起来较为方便,通过springboot的配置文件以及注解的形式即可完成。

1.首先引入依赖:

org.springframework.boot

spring-boot-starter-amqp

2.编写配置文件

# rabbitmq基本配置

spring.rabbitmq.host=***

spring.rabbitmq.port=5672

spring.rabbitmq.username=***

spring.rabbitmq.password=***

spring.rabbitmq.virtual-host=/

# 开启发送确认

spring.rabbitmq.publisher-confirms=true

# 开启发送失败退回

spring.rabbitmq.publisher-returns=true

# 全局开启ACK

spring.rabbitmq.listener.simple.acknowledge-mode=manual

在配置文件中使用

spring.rabbitmq.listener.simple.acknowledge-mode

来配置ack模式,这个配置有三种配置方式,分别为NONE、MANUAL、AUTO。

I:NONE:默认为NONE,也就是自动ack模式,在消费者接受到消息后无需手动ack,消费者会自动将消息ack掉。

II:MANUAL:即为手动ack模式,消费者在接收到消息后需要手动ack消息,不然消息将一直处于uncheck状态,在应用下次启动的时候会再次对消息进行消费。使用该配置需要注意的是,配置开启后即项目全局开启手动ack模式,所有的消费者都需要在消费信息后手动ack消息,否则在重启应用的时候将会有大量的消息无法被消费掉而重复消费。

III:AUTO:自动确认ack 如果此时消费者抛出异常,不同的异常会有不同的处理方式。

3.编写MQConfig的代码,实现相应的queue和exchange的注册以及绑定。

/**

* ACK 测试

*/

public static final String ACK_QUEUE_A = "ack.test.queue.A";

public static final String ACK_QUEUE_B = "ack.test.queue.B";

public static final String ACK_EXCHANGE = "ack.test.exchange";

/**

* ACK TEST

*/

@Bean

public Queue ackQueueA() {

return new Queue(ACK_QUEUE_A);

}

@Bean

public Queue ackQueueB() {

return new Queue(ACK_QUEUE_B);

}

@Bean

public FanoutExchange ackFanoutExchange() {

return new FanoutExchange(ACK_EXCHANGE);

}

@Bean

public Binding ackBindingA() {

return BindingBuilder.bind(ackQueueA()).to(ackFanoutExchange());

}

@Bean

public Binding ackBindingB() {

return BindingBuilder.bind(ackQueueB()).to(ackFanoutExchange())

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ 中,可以使用手动确认(manual acknowledgment)来控制消息的确认。当消费者接收到消息后,可以选择手动确认消息的处理结果,以确保消息已成功处理。 以下是手动确认的步骤: 1. 确保消费者在连接到 RabbitMQ 时将 `auto_ack` 参数设置为 `False`,这样才可以进行手动确认。 2. 消费者接收到消息后,处理消息的逻辑。 3. 在消息处理完成后,调用 `basic_ack` 方法来手动确认消息的处理结果。`basic_ack` 方法的参数是消息的传送标签(delivery tag)。RabbitMQ 将根据传送标签来确定哪个消息被确认。 下面是一个使用 Python pika 库的示例代码: ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='my_queue', durable=True) def callback(ch, method, properties, body): # 处理消息逻辑 print("Received message:", body) # 手动确认消息 ch.basic_ack(delivery_tag=method.delivery_tag) channel.basic_consume(queue='my_queue', on_message_callback=callback) channel.start_consuming() ``` 在上述代码中,`basic_ack` 方法被调用来手动确认消息的处理结果。 注意事项: - 如果消费者在处理消息时出现异常或崩溃,而没有调用 `basic_ack` 方法进行手动确认,RabbitMQ 将假设该消息未被成功处理,并将其重新分发给其他消费者。 - 当使用手动确认时,确保在合适的时机调用 `basic_ack` 方法,以免导致消息被重复处理。 希望以上信息对您有所帮助!如有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值