Disruptor的版本3.4.2.
List-1
public interface ExceptionHandler<T>
{
/**
* <p>Strategy for handling uncaught exceptions when processing an event.</p>
*
* <p>If the strategy wishes to terminate further processing by the {@link BatchEventProcessor}
* then it should throw a {@link RuntimeException}.</p>
*
* @param ex the exception that propagated from the {@link EventHandler}.
* @param sequence of the event which cause the exception.
* @param event being processed when the exception occurred. This can be null.
*/
void handleEventException(Throwable ex, long sequence, T event);
/**
* Callback to notify of an exception during {@link LifecycleAware#onStart()}
*
* @param ex throw during the starting process.
*/
void handleOnStartException(Throwable ex);
/**
* Callback to notify of an exception during {@link LifecycleAware#onShutdown()}
*
* @param ex throw during the shutdown process.
*/
void handleOnShutdownException(Throwable ex);
}
如List-1所示,它是个接口,定义了异常抛出时回调的方法。
如下List-2所示,Disruptor中默认使用ExceptionHandler的ExceptionHandlerWrapper实现,如List-3所示,使用了代理,委托内部的delete来处理。
List-2
public class Disruptor<T>
{
private final RingBuffer<T> ringBuffer;
private final Executor executor;
private final ConsumerRepository<T> consumerRepository = new ConsumerRepository<>();
private final AtomicBoolean started = new AtomicBoolean(false);
private ExceptionHandler<? super T> exceptionHandler = new ExceptionHandlerWrapper<>();
...
List-3
public class ExceptionHandlerWrapper<T> implements ExceptionHandler<T>
{
private ExceptionHandler<? super T> delegate = new FatalExceptionHandler();
public void switchTo(final ExceptionHandler<? super T> exceptionHandler)
{
this.delegate = exceptionHandler;
}
...
除了ExceptionHandlerWrapper这个实现,还有其它FatalExceptionHandler、IgnoreExceptionHandler,IgnoreExceptionHandler只是将异常打印下,但是FatalExceptionHandler则不同,正如其名字所示,它内部将异常再次封装到RuntimeException再次抛出,如下List-4
List-4
public final class FatalExceptionHandler implements ExceptionHandler<Object>
{
private static final Logger LOGGER = Logger.getLogger(FatalExceptionHandler.class.getName());
private final Logger logger;
public FatalExceptionHandler()
{
this.logger = LOGGER;
}
public FatalExceptionHandler(final Logger logger)
{
this.logger = logger;
}
@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);
}
...
如果使用了FatalExceptionHandler,运行中抛出异常,那么会时Disruptor线程阻塞的。ExceptionHandlerWrapper和BatchEventProcessor中exceptionHandler都默认使用了FatalExceptionHandler,所以要特别注意。
来源:oschina
链接:https://my.oschina.net/u/2518341/blog/4300905