java - FlexibleSearchService 不适用于 fork join 池 (hybris)

标签 java sap-commerce-cloud

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

@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

顺便说一句,如果我的 Controller 看起来像这样(没有 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引擎具有并行处理和其他保护。

关于java - FlexibleSearchService 不适用于 fork join 池 (hybris),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48135007/

相关文章:

java - 在 @serverEndpoint 类中注入(inject) EJB 会导致 NullPointerException

java - 将第一个文件的每一行与java中第二个文件的全部内容进行比较

java - 从 6.3 升级时的 Hybris 6.7 服务器启动问题

angular - 如何在斯巴达克斯中抑制静态页面的自定义上下文?

java - RSS Feed 解析,提取字段值

java - 使用 JAXB 检索嵌套的 XML 元素值

tomcat - Intellij IDE 持有 models.jar 不让 hybris 清理构建

sap-commerce-cloud - Hybris HAC 更新场景

java - 找出模型属性在 Hybris 中发生变化的地方

java - 如何从我的Android手机麦克风捕获音频