mybatis源码解读:executor包(错误上下文)
ErrorContext类是一个错误上下文,能够提前将一些背景信息保存下来。这样在真正发生错误时,便能将这些背景信息提供处理,进而给我们的错误排查带来便利。
public class ErrorContext {
// 获得当前操作系统的换行符
private static final String LINE_SEPARATOR = System.getProperty("line.separator","\n");
// 将自身存储进ThreadLocal,从而进行线程间的隔离
private static final ThreadLocal<ErrorContext> LOCAL = new ThreadLocal<>();
// 存储上一版本的自身,从而组成错误链
private ErrorContext stored;
// 下面几条为错误的详细信息,可以写入一项或者多项
private String resource;
private String activity;
private String object;
private String message;
private String sql;
private Throwable cause;
private ErrorContext() {
}
/**
* 从ThreadLocal取出已经实例化的ErrorContext,或者实例化一个ErrorContext放入ThreadLocal
* @return ErrorContext实例
*/
public static ErrorContext instance() {
ErrorContext context = LOCAL.get();
if (context == null) {
context = new ErrorContext();
LOCAL.set(context);
}
return context;
}
/**
* 创建一个包装了原有ErrorContext的新ErrorContext
* @return 新的ErrorContext
*/
public ErrorContext store() {
ErrorContext newContext = new ErrorContext();
newContext.stored = this;
LOCAL.set(newContext);
return LOCAL.get();
}
/**
* 剥离出当前ErrorContext的内部ErrorContext
* @return 剥离出的ErrorContext对象
*/
public ErrorContext recall() {
if (stored != null) {
LOCAL.set(stored);
stored = null;
}
return LOCAL.get();
}
}
ErrorContext类实现了单例模式,而它的单例是绑定到ThreadLocal上的。这保证了每个线程都有唯一的一个错误上下文ErrorContext。ErrorContext类有一种包装机制,即每个ErrorContext对象内还可以保证一个ErrorContext对象,这样错误上下文就可以组成一条错误链。
欢迎关注本人公众号:
还没有评论,来说两句吧...