全部产品
云市场

Tracer 异步处理

更新时间:2019-09-05 19:39:06

异步线程处理

如果在代码中重新启动了线程或者采用了线程池进行业务异步处理,那么需要将 Tracer 日志上下文从父线程传递给子线程中,即引入 com.alipay.common.tracer.concurrent.TracerRunnable 类,使用 TracerRunnable 线程替换普通的 Runnable。代码示例如下:

  1. public void TracerRunnable_Method() {
  2. new Thread(new TracerRunnable() {
  3. public void doRun() {
  4. // 这里写业务代码
  5. }
  6. }).start();
  7. }

说明:SOFABoot 必须为 1.1.0 或更高版本。

异步落数据库后恢复 Tracer 上下文

从 SOFABoot 1.1.0 开始,Tracer 针对异步落数据库后恢复 Tracer 上下文的需求提供了两个新的 API:

  • TracerContextUtil.createChildContextAndGetAsSerializedString():此方法用于在当前线程的 Tracer 日志上下文上产生一个子上下文并且将其序列化成一个字符串,使用方可以拿到这个字符串,然后再将这个字符串随着业务数据一起记录到数据库中。

  • TracerContextUtil.restoredSerializedLogContext():此方法用于将上个方法序列化后的字符串恢复成一个 DummyLogContext。需要特别注意的是,您在线程中使用此 API 时,一定要在 finally 中对 Tracer 的日志上下文进行清理,代码示例如下:

  1. public void run() {
  2. try {
  3. TracerContextUtil.restoredSerializedLogContext(serializedLogContext);
  4. // 实际业务逻辑
  5. } finally {
  6. AbstractLogContext.set(null);
  7. }
  8. }