您的位置 首页 > 腾讯云社区

Disruptor之生产者阻塞 ---克虏伯

Disruptor版本是3.4.2.

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

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

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

List-1

"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

@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); } ---来自腾讯云社区的---克虏伯

关于作者: 瞎采新闻

这里可以显示个人介绍!这里可以显示个人介绍!

热门文章

留言与评论(共有 0 条评论)
   
验证码: