如何在Spring中的@Async方法中使用当前语言环境

时间:2016-11-17 12:59:28

标签: java spring localization

我有一个服务,其中包含异步发送电子邮件的方法。发件人方法具有@Async注释。但是当我尝试在该方法中使用当前语言环境时,它始终是默认语言环境。所以问题是如何将语言环境传递给@Async方法。

3 个答案:

答案 0 :(得分:1)

我相信您正在使用LocaleContextHolder访问当前的语言环境。

在执行异步方法之前,将当前语言环境设置为LocaleContextHolder,并将可继承标志设置为true,例如:

Locale currentLocale = LocaleContextHolder.getLocale();
LocaleContextHolder.setLocale(currentLocale, true);

当将继承标志设置为true时,当前线程产生的所有子线程都将继承LocaleContext,其行为类似于本地线程。

参考:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/i18n/LocaleContextHolder.html#setLocale-java.util.Locale-boolean-

答案 1 :(得分:0)

可以实现将Locale作为参数的自定义AsyncTaskExecutor。然后它会将语言环境设置为其上下文。

public interface LocaleAsyncTaskExecutor extends AsyncTaskExecutor {
    void execute(Runnable task, Locale locale);
}

答案 2 :(得分:0)

chunhoong的解决方案对我有用,但这不是语义上的。 我有一个更好的解决方案:为所有线程设置相同的请求上下文。主线程和所有@Async线程应共享DispatcherServlet上下文(setThreadContextInheritable(true))。它像一种魅力一样工作:

@SpringBootApplication
public class CoreApplication {
    public static void main(String[] args) {
        SpringApplication
                .run(CoreApplication.class, args)
                .getBean(DispatcherServlet.class)
                .setThreadContextInheritable(true);
    }
}

PS:这对我有很大帮助:https://github.com/spring-projects/spring-boot/issues/14079