专栏首页生活不止眼前的代码RabbitMQ笔记(六)-BlockedListener

RabbitMQ笔记(六)-BlockedListener

BlockedListener 是监听连接阻塞情况的监听器

这个监听器在服务器内存报警或者硬盘报警的情况下,使用发送接口会产生阻塞,如果发送和接受等使用同一个连接,则会都阻塞,因此我们应该为消费者和生产者使用不同的CachingConnectionFactory,或者设置rabbitTemplate.setUsePublisherConnection(true);

BlockedListener的代码

@Slf4j
@Service
public class RabbitBlockedListener implements BlockedListener {
    @Override
    public void handleBlocked(String s) throws IOException {
        log.info("=========================connection blocked, reason: {}", s);
    }

    @Override
    public void handleUnblocked() throws IOException {
        log.info("==============================connection unblocked");
    }
}

是在RabbitMQ connection连接上的时候设置进去的

@Slf4j
@Service
public class RabbitConnectionListener implements ConnectionListener {
    @Autowired
    private RabbitBlockedListener rabbitBlockedListener;
    @Override
    public void onCreate(Connection connection) {
        log.info("================onCreate: {}", connection);
        connection.addBlockedListener(rabbitBlockedListener);
    }

    @Override
    public void onClose(Connection connection) {
        log.info("================onClose: {}", connection);
    }

    @Override
    public void onShutDown(ShutdownSignalException signal) {
        log.info("================onShutDown: {}", signal);
    }
}

正常情况下,RabbitMQ的状态是这样的

测试内存报警

RabbitMQ内存报警水位是由vm_memory_high_watermark来控制的

在RabbitMQ使用 rabbitmqctl set_vm_memory_high_watermark 0.01

  • 设置内存报警的水位,当内存使用达到了该水位时,RabbitMQ将产生报警
  • 可以通过rabbitmqctl status | grep vm_memory_high_watermark查看当前的水位设置,默认时0.4

此时查看报警时的RabbitMQ的状态

此时往RabbitMQ发送一条消息,将会收到BlockedListener的消息,且reason会提示具体的错误原因

2019-01-09 23:49:53.408  INFO 73408 --- [xxxxxxx] c.m.demo.listener.RabbitBlockedListener  : =========================connection blocked, reason:low on memory

再将水位修改回来 rabbitmqctl set_vm_memory_high_watermark 0.4

查看此时的程序的打印

2019-01-09 23:51:40.386  INFO 73408 --- [xxxxxxx] c.m.demo.listener.RabbitBlockedListener  : ==============================connection unblocked
2019-01-09 2:351:40.396  INFO 73408 --- [xxxxxxx] c.m.d.l.i.ConfirmCallbackListenerImpl    : ConfirmCallbackListener thread:  CorrelationData: null, ack: true, cause: null
2019-01-09 23:51:40.398  INFO 73408 --- [cTaskExecutor-4] com.mt.demo.rabbitmq.HelloListener2      : receive int msg: 30

测试磁盘报警

同样的修改磁盘的配置

rabbitmqctl set_disk_free_limit 48G
  • 设置空闲磁盘的大小,空闲值小于该值时产生报警,默认时48M
  • 也可以使用这个命令将磁盘和内存的大小关联起来设置 xx时磁盘和内存的配比 rabbitmqctl set_disk_free_limit mem_relative xx

此时查看RabbitMQ的控制台

此时往RabbitMQ发送一条消息,将会收到BlockedListener的消息,且reason会提示具体的错误原因

2019-01-09 23:58:17.318  INFO 49240 --- [xxxxxxx] c.m.demo.listener.RabbitBlockedListener  : =========================connection blocked, reason:low on disk

再将磁盘限制修改回来

rabbitmqctl set_disk_free_limit 48M
2019-01-09 23:58:49.793  INFO 49240 --- [xxxxxxx] c.m.demo.listener.RabbitBlockedListener  : ==============================connection unblocked
2019-01-09 23:58:49.801  INFO 49240 --- [xxxxxxx] c.m.d.l.i.ConfirmCallbackListenerImpl    : ConfirmCallbackListener thread:  CorrelationData: null, ack: true, cause: null
2019-01-09 23:58:49.806  INFO 49240 --- [cTaskExecutor-3] com.mt.demo.rabbitmq.HelloListener2      : receive int msg: 30

测试同时报警

同时设置内存和磁盘报警

发送消息到队列,则会在这个监听器产生报警信息。

2019-01-10 00:00:08.811  INFO 49240 --- [xxxxxxx] c.m.demo.listener.RabbitBlockedListener  : =========================connection blocked, reason:low on disk & memory

需要同时解除内存和磁盘的报警才会收到unblock的消息

2019-01-10 00:04:05.764  INFO 49240 --- [xxxxxxx] c.m.demo.listener.RabbitBlockedListener  : ==============================connection unblocked
2019-01-10 00:04:05.765  INFO 49240 --- [xxxxxxx] c.m.d.l.i.ConfirmCallbackListenerImpl    : ConfirmCallbackListener thread:  CorrelationData: null, ack: true, cause: null
2019-01-10 00:04:05.766  INFO 49240 --- [cTaskExecutor-2] com.mt.demo.rabbitmq.HelloListener2      : receive int msg: 30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Swagger笔记(二)springboot集成和ApiModel使用不当的一个小问题

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    yingzi_code
  • SpringCloudGateway笔记(8)-权重

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    yingzi_code
  • RabbitMQ笔记(五)-RabbitTemplate

    ConfirmCallback: ConfirmCallback接口用于实现消息发送到RabbitMQ交换器后接收ack回调

    yingzi_code
  • 奇异值分解 SVD 的数学解释

    奇异值分解(Singular Value Decomposition,SVD)是一种矩阵分解(Matrix Decomposition)的方法。除此之外,矩阵分...

    Alan Lee
  • Java编程解析—淘宝大秒杀系统设计

    最初的秒杀系统的原型是淘宝详情上的定时上架功能,由于有些卖家为了吸引眼球,把价格压得很低。但这给的详情系统带来了很大压力,为了将这种突发流量隔离,才设计了秒杀系...

    慕容千语
  • Android项目重构之路:实现篇(一)

    前两篇文章《Android项目重构之路:架构篇》和《Android项目重构之路:界面篇》已经讲了我的项目开始搭建时的架构设计和界面设计,这篇就讲讲具体怎么实现的...

    Keegan小钢
  • 淘宝大秒系统设计详解

    大家还记得2013年的小米秒杀吗?三款小米手机各11万台开卖,走的都是大秒系统,3分钟后成为双十一第一家也是最快破亿的旗舰店。经过日志统计,前端系统双11峰值有...

    周三不加班
  • H5实现本地预览图片

    最后注意一点,H5实现图片预览只能使用原生JS进行DOM元素的操作,若使用jQuery则无法实现该效果。

    雪飞鸿
  • php批量修改图片名称

    素描
  • 纪念那些在2019年逝去的技术

    每年都能看到有些受欢迎的应用程序,值得关注的初创公司和一些新奇想法还未真正起步就逐渐淡出我们的视线。

    大数据文摘

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动