【问题标题】:Make main thread wait until the context is copied by child threads让主线程等到上下文被子线程复制
【发布时间】:2020-11-12 12:44:30
【问题描述】:

我正在研究执行以下任务的流程:

1.Kafka Consumer consumes kafka message and does some task A
2.It then starts an async process using @Async in spring boot
3.It clears the context and exits

我正在使用 TaskDecorator 将上下文传递给 Async

public class AsyncTaskDecorator implements TaskDecorator {
   ContextProvider provider = ContextProvider.getContext();

}

下面是我的 ContextProvider 类

private static final ThreadLocal<CountryContextProvider> CONTEXT = new ThreadLocal<>();
 public static void clear() {
     CONTEXT.clear();
 }

我面临的问题是父线程在子线程可以使用 ContextProvider provider = ContextProvider.getContext();

复制之前在上下文中调用 clear

如何确保子线程能够在父线程调用 clear 之前获取上下文。另外,我不能让主线程等待子线程,使用 Async 的重点是允许子线程独立执行。

【问题讨论】:

    标签: java multithreading spring-boot


    【解决方案1】:

    您可以并且应该做的是从 Parent 中删除上下文清除操作并将其委托给 Child 本身。您可以如下编写您的 AsyncTaskDecorator;

    public class AsyncTaskDecorator implements TaskDecorator {
       public Runnable decorate(Runnable runnable) {
          return () -> {
              try {
                  ContextProvider provider = ContextProvider.getContext();
                  // Use it here
              } finally {
                  ContextProvider.getContext().clear();
              }
          };
       }
    }
    

    【讨论】:

    • 不能这样做,因为我们不能假设非异步部分不会有异常。如果在调用异步之前有任何异常,则永远不会清除上下文
    猜你喜欢
    • 2022-01-02
    • 2014-10-05
    • 2012-07-22
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多