我有一个服务,其中包含异步发送电子邮件的方法。发件人方法具有@Async
注释。但是当我尝试在该方法中使用当前语言环境时,它始终是默认语言环境。所以问题是如何将语言环境传递给@Async
方法。
答案 0 :(得分:1)
我相信您正在使用LocaleContextHolder访问当前的语言环境。
在执行异步方法之前,将当前语言环境设置为LocaleContextHolder,并将可继承标志设置为true,例如:
Locale currentLocale = LocaleContextHolder.getLocale();
LocaleContextHolder.setLocale(currentLocale, true);
当将继承标志设置为true时,当前线程产生的所有子线程都将继承LocaleContext,其行为类似于本地线程。
答案 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