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);
}