mybatis源码解读:executor包(错误上下文)

清疚 2022-10-29 09:09 313阅读 0赞

ErrorContext类是一个错误上下文,能够提前将一些背景信息保存下来。这样在真正发生错误时,便能将这些背景信息提供处理,进而给我们的错误排查带来便利。

  1. public class ErrorContext {
  2. // 获得当前操作系统的换行符
  3. private static final String LINE_SEPARATOR = System.getProperty("line.separator","\n");
  4. // 将自身存储进ThreadLocal,从而进行线程间的隔离
  5. private static final ThreadLocal<ErrorContext> LOCAL = new ThreadLocal<>();
  6. // 存储上一版本的自身,从而组成错误链
  7. private ErrorContext stored;
  8. // 下面几条为错误的详细信息,可以写入一项或者多项
  9. private String resource;
  10. private String activity;
  11. private String object;
  12. private String message;
  13. private String sql;
  14. private Throwable cause;
  15. private ErrorContext() {
  16. }
  17. /**
  18. * 从ThreadLocal取出已经实例化的ErrorContext,或者实例化一个ErrorContext放入ThreadLocal
  19. * @return ErrorContext实例
  20. */
  21. public static ErrorContext instance() {
  22. ErrorContext context = LOCAL.get();
  23. if (context == null) {
  24. context = new ErrorContext();
  25. LOCAL.set(context);
  26. }
  27. return context;
  28. }
  29. /**
  30. * 创建一个包装了原有ErrorContext的新ErrorContext
  31. * @return 新的ErrorContext
  32. */
  33. public ErrorContext store() {
  34. ErrorContext newContext = new ErrorContext();
  35. newContext.stored = this;
  36. LOCAL.set(newContext);
  37. return LOCAL.get();
  38. }
  39. /**
  40. * 剥离出当前ErrorContext的内部ErrorContext
  41. * @return 剥离出的ErrorContext对象
  42. */
  43. public ErrorContext recall() {
  44. if (stored != null) {
  45. LOCAL.set(stored);
  46. stored = null;
  47. }
  48. return LOCAL.get();
  49. }
  50. }

ErrorContext类实现了单例模式,而它的单例是绑定到ThreadLocal上的。这保证了每个线程都有唯一的一个错误上下文ErrorContext。ErrorContext类有一种包装机制,即每个ErrorContext对象内还可以保证一个ErrorContext对象,这样错误上下文就可以组成一条错误链。

欢迎关注本人公众号:

20201220181855568.png

发表评论

表情:
评论列表 (有 0 条评论,313人围观)

还没有评论,来说两句吧...

相关阅读