ExceptionHandler - minbox-projects/message-pipe GitHub Wiki
ExceptionHandler
是操作消息管道(MessagePipe
)内的消息(Message
)时遇到异常的处理器,默认使用ConsoleExceptionHandler
进行打印异常的堆栈信息。
1. 什么时候触发?
目前触发的地方有三个,分别是:
- 向消息管道内写入单个消息时(MessagePipe#putLast)
- 处理消息管道内第一个消息时(MessagePipe#handleFirst)
- 处理消息管道内的全部消息时(MessagePipe#handleToLast)
2. 作用?
目前默认的作用是打印处理具体消息时的异常堆栈信息,方便我们定位异常。
也可以定义一些其他的用途,比如:
- 邮件通知
- 异常报表统计
- 缓存异常消息
- ...
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;
}