gpt4 book ai didi

java - Spring 中新线程上的 Rx java 本地化问题

转载 作者:行者123 更新时间:2023-12-02 03:33:02 26 4
gpt4 key购买 nike

我正在尝试使 RxJava 适应现有的 Spring 项目。我的目标是异步提供 WS REST 调用(我知道 @Async ,但让我们忽略这一点)。

问题在于通过 REST 调用提供的语言环境进行翻译。在请求中,我有一个像这样的 header

Accept-Language: cs

表示我想以所需的语言提供服务。现在RxJava我创建了一个 Observable它从数据库中获取行并通过 Observable.map操作使用

进行翻译
LocaleContextHolder.getLocale().getLanguage();

问题在于 Spring LocaleContextHolder规范说明:

Simple holder class that associates a LocaleContext instance with the **current** **thread**. 

但是我订阅了Observable在新线程池中工作,因为这是一个成本高昂的操作。所以我的简化订阅如下所示:

@RequestMapping(value = "/valid", method = RequestMethod.GET)
@ResponseBody
public DeferredResult<List<CustomerServicesPrintableInfo>> getValidServicesForCustomer() {
DeferredResult<List<CustomerServicesPrintableInfo>> result = new DeferredResult<>(10000L);
List<CustomerServicesPrintableInfo> customerServices = new ArrayList<>();
customerServiceService.getPrintableByCustomerLogin(username)
.subscribeOn(Schedulers.io())
.subscribe(customerServices::add,
LOGGER::error,
() -> {
result.setResult(customerServices);
});

return result;

但问题是,一旦执行在新线程中运行,新线程中的区域设置就是默认的 eng这不是我想要的cs 。如果我省略.subscribeOn(Schedulers.io()) ,一切正常,但在当前线程上,这是不希望的。

所以问题是 - 我如何清楚地传播(或告诉 Spring/RxJava)新创建的线程应使用传入的语言环境?

最佳答案

你要做的就是将当前线程与LocaleContext关联起来;最简单的方法是创建您自己的调度程序,该调度程序知道它们需要将其传递给新线程,并在它们执行时设置/重置它。

关于java - Spring 中新线程上的 Rx java 本地化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37808148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com