SpringBoot + RabbitMQ从延时队列中删除指定的值【RabbitMQ中的basicAck和basicNack的区别以及basicReject又是什么?】

这篇具有很好参考价值的文章主要介绍了SpringBoot + RabbitMQ从延时队列中删除指定的值【RabbitMQ中的basicAck和basicNack的区别以及basicReject又是什么?】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

业务需求是,就是我本来是有一个order-queue队列绑定到了死信队列交换机order-dead-direct-exchange上,然后我的业务是,现在有一个用户下单但是没有付款,order-queue队列写入该条信息并计时24小时后如果用户还是未付款状态则移除到死信队列order-dead-queue中。问题来了,如果在这个24小时内,用户取消订单,这时候就要从order-queue队列中移除该条信息。怎么操作呢?

1、确保依赖的引入

<!-- springboot集成rabbitMQ -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2、业务代码实现从某个队列中删除指定的值

@Autowired
private RabbitTemplate rabbitTemplate;

@Autowired
private ConnectionFactory connectionFactory;

//取消订单
@PostMapping("/cancelOrder")
public Object cancelOrder(String productId,String dyOrderId,String cancelText,String buyerPaymentState,String orderDeliveryState,String state,String orderId,String buyerPaymentPrice) throws IOException, TimeoutException {

    //删除rabbitMQ中order-queue队列中对应的值? 重新上架商品?
    // 从 order-queue 队列中移除指定订单
    Channel channel = connectionFactory.createConnection().createChannel(false);
    boolean deleted = false;
    while (!deleted) {
        GetResponse response = channel.basicGet("order-queue", false);
        if (response == null) {
            break;
        }
        String messageValue = new String(response.getBody(), StandardCharsets.UTF_8);
        if (messageValue.equals(productId+"_"+dyOrderId)) {
            deleted = true;
            channel.basicAck(response.getEnvelope().getDeliveryTag(), false);
            continue;
        }
        channel.basicNack(response.getEnvelope().getDeliveryTag(), false, true);
    }
    channel.close();
        

这段代码使用 basicGet 方法接收队列中的消息,并使用 basicAck 方法手动确认消费。如果找到包含特定值的消息,就设置 deleted 为 true,并使用 basicAck 确认该消息的消费,然后跳过该消息,最终将其从队列中删除。如果消息的值不等于指定的值,则使用 basicNack 方法将消息放回队列中。这样我们就是实现了从队列中删除指定的值。

需要注意的是,当使用手动确认模式时,如果在消费消息后没有进行确认或拒绝,消息将一直处于 unack 状态,直到消费者关闭或重新连接。这可能会导致消息被重新投递,因此需要确保在处理完每个消息后进行确认或拒绝操作。

3、basicAck 和 basicNack有什么区别呢?

在RabbitMQ中,当消费者从队列中获取到一条消息并进行处理后,需要告诉服务器这条消息已经被成功处理了,这时可以使用basicAck方法来确认消息的消费。而如果处理消息时发生了错误,需要将这条消息重新放回队列中,或者直接将消息丢弃,就可以使用basicNack方法。
basicAck方法表示消费者已经成功地处理了消息,并告诉RabbitMQ可以删除此消息。它的方法签名如下:

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

其中,deliveryTag表示消息的唯一标识符,multiple表示是否批量确认(如果设置为true,则表示确认所有小于等于deliveryTag的消息)。

basicNack方法则是表示消费者处理消息时发生了错误,需要将消息重新放回队列中,或者直接将消息丢弃。它的方法签名如下:

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

其中,deliveryTagmultiple的含义与basicAck方法相同,requeue表示是否重新将消息放回队列(如果设置为true,则将消息重新放回队列,如果设置为false,则直接将消息丢弃)。

需要注意的是,basicNack方法并不是所有的AMQP客户端都支持的。如果你的客户端不支持basicNack方法,可以使用basicReject方法来实现相同的效果。

4、basicReject又是什么?

basicReject是AMQP协议提供的一个API,用于拒绝(reject)一条消息,并选择是否将消息重新投递到队列中。它与basicNack类似,但有一些细微的区别。

basicReject的方法签名如下:

void basicReject(long deliveryTag, boolean requeue);

其中,deliveryTag是消息投递标识符,requeue表示是否将消息重新投递到队列中。

basicNack的区别在于,basicReject只能拒绝单个消息,而basicNack可以拒绝多个消息。此外,basicReject无法设置拒绝原因,而basicNack可以设置拒绝原因。

需要注意的是,使用basicRejectbasicNack将会导致RabbitMQ重新将消息投递到队列中,这可能会导致消息的不断重试,因此需要谨慎使用。如果希望立即删除消息而不是重新投递,可以使用basicAck方法。文章来源地址https://www.toymoban.com/news/detail-598024.html

到了这里,关于SpringBoot + RabbitMQ从延时队列中删除指定的值【RabbitMQ中的basicAck和basicNack的区别以及basicReject又是什么?】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • RabbitMQ实现延迟消息,RabbitMQ使用死信队列实现延迟消息,RabbitMQ延时队列插件

    RabbitMQ实现延迟消息,RabbitMQ使用死信队列实现延迟消息,RabbitMQ延时队列插件

    假设有一个业务场景:超过30分钟未付款的订单自动关闭,这个功能应该怎么实现? RabbitMQ使用死信队列,可以实现消息的延迟接收。 队列有一个消息过期属性。就像丰巢超过24小时就收费一样,通过设置这个属性,超过了指定事件的消息将会被丢弃。 这个属性交:x-message

    2024年02月13日
    浏览(54)
  • 【技术分享】四、RabbitMQ “延时队列”

    【技术分享】四、RabbitMQ “延时队列”

    延时的含义为 等待一段时间,应用到RabbitMQ 消息 发布/订阅 模型中的概念就是,拿到消息后不想立即消费,等待一段时间再执行。 ex: 定时任务:十分钟后执行某种操作。 批量发送短信:用户量过大,一次性发送短信卡死,可以将几万条消息分布在10分钟内随机发送完成。

    2024年02月08日
    浏览(12)
  • .NET中使用RabbitMQ延时队列和死信队列

    .NET中使用RabbitMQ延时队列和死信队列

    延时队列是RabbitMQ中的一种特殊队列,它可以在消息到达队列后延迟一段时间再被消费。 延时队列的实现原理是通过使用消息的过期时间和死信队列来实现。当消息被发送到延时队列时,可以为消息设置一个过期时间,这个过期时间决定了消息在延时队列中等待的时间。如果

    2024年02月15日
    浏览(11)
  • Golang RabbitMQ实现的延时队列

    Golang RabbitMQ实现的延时队列

    之前做秒杀商城项目的时候使用到了延时队列来解决订单超时问题,本博客就总结一下Golang是如何利用RabbitMQ实现的延时队列的。 延迟队列是一种特殊类型的消息队列 ,用于在一定时间后将消息投递给消费者。它可以用于处理需要延迟执行的任务或者具有定时特性的业务场景

    2024年02月10日
    浏览(16)
  • 深入浅出RabbitMQ:顺序消费、死信队列和延时队列

    深入浅出RabbitMQ:顺序消费、死信队列和延时队列

    大家好,我是小❤,一个漂泊江湖多年的 985 非科班程序员,曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。 上篇文章(应对流量高峰的利器——消息中间件)中,我们已经介绍了消息中间件的用途,主要用作:解耦、削峰、异步通信、应用解耦,并介绍了业界常

    2024年02月03日
    浏览(11)
  • rabbitmq延时队列自动解锁库存

    rabbitmq延时队列自动解锁库存

    一、库存服务自动解锁库存 使用了最终一致性来解决分布式事务 当order服务出现异常回滚,此时ware服务无法回滚,怎么办? 使用seata全局事务虽然能在order服务出现异常导致 回滚 时使其他服务的也能同时回滚,但在流量大的情况下是使用加锁的方式,效率 低不适合并发量大

    2024年02月16日
    浏览(12)
  • RabbitMQ延时队列的实现原理和应用实例

    RabbitMQ延时队列的实现原理和应用实例

    TTL 是 RabbitMQ 中一个消息或者队列的属性,表明一条消息或者该队列中的所有消息的最大存活时间,单位是毫秒。 目前有两种方法可以设置消息的 TTL: 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间; 第二种方法是对消息本身进行单独设置,每条消息

    2024年02月05日
    浏览(11)
  • 一种多策略下RabbitMQ的延时队列实现

    一种多策略下RabbitMQ的延时队列实现

    场景: 最近在开发一款系统中遇到这样一个场景,A系统开通套餐需要把套餐信息以邮件的形式发送给相关工作人员,经过人工审核通过后,在B系统里面开通,A系统会调B系统套餐列表接口查询套餐是否开通成功,开通成功则从A系统去完成订单,假如超过设定时间未开通成功,则关闭订

    2024年02月12日
    浏览(11)
  • RabbitMQ延时队列的详细介绍以及Java代码实现

    RabbitMQ延时队列的详细介绍以及Java代码实现

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将详细介绍RabbitMQ的延时队列以及其详细代码实现。 如果文章有什么需要改进的地方还请大佬不吝赐教 👏👏。 小威在此先感谢各位大佬啦~~🤞🤞 🏠个人主页:小威要向诸佬学习呀 🧑个人简介:大

    2024年02月01日
    浏览(7)
  • springboot kafka 实现延时队列

    springboot kafka 实现延时队列

    好文推荐: 2.5万字详解23种设计模式 基于Netty搭建websocket集群实现服务器消息推送 2.5万字讲解DDD领域驱动设计 延时队列:是一种消息队列,可以用于在指定时间或经过一定时间后执行某种操作。 小编已经做好了 Kafka延时队列的封装,以后只需要一行代码就可以实现kafka延时

    2024年02月03日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包