前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Disruptor之生产者阻塞

Disruptor之生产者阻塞

作者头像
克虏伯
发布2020-04-23 17:37:06
1.8K0
发布2020-04-23 17:37:06
举报

Disruptor版本是3.4.2.

    现象: 项目中用Disruptor实现了生产者和消费者模型,但是生产者往disruptor的ringBuffer中放消息时阻塞了——用jstack  -l  Pid > dump.txt可以看出所有的线程都处于Time_waited状态。    

    这样导致我们的上游中间件队列中消息不断堆积。

    如下List-1是jstack出来的往Disruptor队列中放消息的线程处于阻塞状态:

List-1

代码语言:javascript
复制
"Thread-0" #9 prio=5 os_prio=0 tid=0x00007f56ac489000 nid=0x1d runnable [0x00007f568505c000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:338)
	at com.lmax.disruptor.MultiProducerSequencer.next(MultiProducerSequencer.java:136)
	at com.lmax.disruptor.MultiProducerSequencer.next(MultiProducerSequencer.java:105)
	at com.lmax.disruptor.RingBuffer.next(RingBuffer.java:263)
......

    原因,同事写的功能,在static{ }块中从数据库中查询数据,但是测试环境该表不存在,所以报了"java.lang.NoClassDefFoundError: Could not initialize class "的错误,这个异常是Error,所以我们在handler中的catch(Exception e)没有抓到,导致disruptor阻塞了。

    Disruptor中FatalExceptionHandler来处理异常,但是呢,它的handleEventException方法中如下List-2,它又把异常给抛出去了。

List-2

代码语言:javascript
复制
@Override
public void handleEventException(final Throwable ex, final long sequence, final Object event)
{
    logger.log(Level.SEVERE, "Exception processing: " + sequence + " " + event, ex);

    throw new RuntimeException(ex);
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档