ExceptionHandler - minbox-projects/message-pipe GitHub Wiki

ExceptionHandler是操作消息管道(MessagePipe)内的消息(Message)时遇到异常的处理器,默认使用ConsoleExceptionHandler进行打印异常的堆栈信息。

1. 什么时候触发?

目前触发的地方有三个,分别是:

  • 向消息管道内写入单个消息时(MessagePipe#putLast)
  • 处理消息管道内第一个消息时(MessagePipe#handleFirst)
  • 处理消息管道内的全部消息时(MessagePipe#handleToLast)

2. 作用?

目前默认的作用是打印处理具体消息时的异常堆栈信息,方便我们定位异常。

也可以定义一些其他的用途,比如:

  1. 邮件通知
  2. 异常报表统计
  3. 缓存异常消息
  4. ...

3. 自定义异常处理器

/**
 * 自定义邮件通知{@link ExceptionHandler}
 *
 * @author 恒宇少年
 */
@Component
@Slf4j
public class EmailNotificationExceptionHandler implements ExceptionHandler {
    @Override
    public void handleException(Exception exception, Object target) {
        // 处理的消息对象,该对象可能为空
        if (!ObjectUtils.isEmpty(target)) {
            Message message = (Message) target;
            log.info("消息内容:{}", JsonUtils.objectToJson(message));
        }
        // 输出异常堆栈
        log.error(exception.getMessage(), exception);
        // 处理邮件通知逻辑
    }
}

上面是实现ExceptionHandler接口的一个自定义发送邮件的异常处理器示例。

4. 替换默认异常处理器

替换默认的异常处理器即让我们自定义的异常处理器生效,我们可以通过MessagePipeConfiguration#setExceptionHandler方法来实现,如下所示:

/**
  * 邮件通知异常处理
  */
@Autowired
private EmailNotificationExceptionHandler emailNotificationExceptionHandler;

@Bean
public MessagePipeConfiguration messagePipeConfiguration() {
  MessagePipeConfiguration configuration = MessagePipeConfiguration.defaultConfiguration();
  // 替换默认异常处理器
  configuration
    .setExceptionHandler(emailNotificationExceptionHandler)
    return configuration;
}