Как предотвратить обмен многопоточными ответами в Concurrent Future Java? - PullRequest
1 голос
/ 08 мая 2019

Проверьте код ниже.Существует проблема в многопоточности, где результаты из каждого потока меняются местами

Мы пробовали использовать withWheelColor.isDone и withWheelColor.isCancelled, а также окружили его с помощьюWheelColor.get (), но не повезло

    final Map<String, Object> result = new HashMap<>();
    final ExecutorService executor = Executors.newFixedThreadPool(2);
    ProductSearchPageData<SearchStateData, ProductData> searchPageData = null;
    Future<ProductSearchPageData<SearchStateData, ProductData>> withWheelColor= null;
    Future<ProductSearchPageData<SearchStateData, ProductData>> withoutWheelColor = null;
    final  LinkedHashMap<String, String> sortedParams = getSortedParams(form.getParams(), form.getLastParam());
    final PageableData pageableData = createPageableData(0,
            getSearchPageSize(), null, ShowMode.Page);
    final SearchStateData searchState = new SearchStateData();
    searchState.setPdpFlow(Boolean.TRUE);
    final SearchQueryData searchQueryData = new SearchQueryData();
    String productCode = null;

    try {
        Callable<ProductSearchPageData<SearchStateData, ProductData>> withWheelColorThread = new DTCallable<ProductSearchPageData<SearchStateData, ProductData>>(
                null) {
            @Override
            public ProductSearchPageData<SearchStateData, ProductData> callMe(
                    String pk) throws Exception {
                buildWithParams(sortedParams, searchState,
                        searchQueryData, form);
                return productSearchFacade.textSearch(searchState,
                        pageableData);
            }
        };
        withWheelColor = executor.submit(withWheelColorThread);

        if (sortedParams.containsKey(WheelProductModel.WHEELCOLOR)
                && sortedParams.size() > 1) {
            Callable<ProductSearchPageData<SearchStateData, ProductData>> withoutWheelColorThread = new DTCallable<ProductSearchPageData<SearchStateData, ProductData>>(
                    null) {
                @Override
                public ProductSearchPageData<SearchStateData, ProductData> callMe(
                        String pk) throws Exception {
                    sortedParams.remove(WheelProductModel.WHEELCOLOR);//Call without wheelColor
                    buildWithParams(sortedParams, searchState,
                            searchQueryData, form);
                    return productSearchFacade.textSearch(searchState,
                            pageableData);
                }
            };
            withoutWheelColor = executor.submit(withoutWheelColorThread);
        }

        executor.shutdown();
        if (!executor.awaitTermination(120, TimeUnit.SECONDS)) {
            if(LOG.isDebugEnabled()) {
                LOG.debug("No Result Found!");
            }
        }
        if (null != withoutWheelColor
                && null != withoutWheelColor.get()
                && CollectionUtils.isNotEmpty(withoutWheelColor.get()
                        .getFacets())) {
            for (final FacetData<SearchStateData> facet : withoutWheelColor
                    .get().getFacets()) {
                if (null != facet.getCode() && facet.getCode()
                        .equals(WheelProductModel.WHEELCOLOR)) {
                    result.put("availableColors", facet.getValues());
                }
            }
        }
        searchPageData = withWheelColor.get();
    } catch (final Exception e) {
        LOG.error("Error getting PDP results : " + e.getMessage());
    }
    processResult(request, result, searchPageData, productCode);
 return result;

Ожидается, что withWheelColor будет только в searchPageData, а не безWheelColor.Чего не хватает в вышеприведенном, чтобы предотвратить обмен?

...