FlexibleSearchService 不适用于 fork join pool (hybris)

FlexibleSearchService doesn't work with fork join pool (hybris)

我有一个休息 api 控制器,它收集大量元素,搜索数据库中的每个元素,更新字段,然后将更新的对象保存在数据库中 响应真的很慢,所以我想使用某种异步调用。 我的代码:

@RequestMapping(value = "qwerty/", method = RequestMethod.POST,
            consumes = {"application/xml"},
            produces = "application/xml")
    @ResponseBody
    public PriceResponceDTOCollection performTask(@RequestBody PriceDataDTOCollection priceList){
final List<PriceError> priceErrorList = new ArrayList<>();
final List<PriceError> priceErrorList = new ArrayList<>();
            final List<CompletableFuture> futures = new ArrayList();
            for (final PriceData price : priceList.getPriceList()) {
                futures.add(CompletableFuture.supplyAsync(()->priceService.setPrice(price)).thenAccept(priceErrorList::add));
            }
            futures.stream().map(CompletableFuture::join).count();

}

这是 priceservice 的 setPrice 方法

@Autowired
private FlexibleSearchService flexibleSearchService;
public PriceError setPrice(Price data){
   //building query
   //initialize map with params
   return flexibleSearchService.search(query.toString(),params).getResult().get(0);
}

然后我在 de.hybris.platform.servicelayer.session.impl.DefaultSessionService.executeInLocalView(DefaultSessionService.java:94)

中得到 NPE

顺便说一句,如果我的控制器看起来像这样(没有 Fork 加入池):

@RequestMapping(value = "qwerty/", method = RequestMethod.POST,
                consumes = {"application/xml"},
                produces = "application/xml")
        @ResponseBody
        public PriceResponceDTOCollection performTask(@RequestBody PriceDataDTOCollection priceList){
    final List<PriceError> priceErrorList = new ArrayList<>();
    for (final PriceData price : priceList.getPriceList()) {
                PriceError err = priceService.setPrice(price);
                priceErrorList.add(err);
            }

    }

一切都很完美。是什么原因(我也试过priceList.getPriceList().parallelstream()也得到NPE)

我认为通过网络服务更新价格是关键操作。也许您可以将更新转换为 impex 并调用 impex 导入服务。 Impex 引擎具有并行处理和其他保护。