/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.master.position.impl; import java.util.Collection; import java.util.Map; import java.util.concurrent.Callable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.id.UniqueId; import com.opengamma.master.position.PositionDocument; import com.opengamma.master.position.PositionMaster; import com.opengamma.master.position.PositionSearchRequest; import com.opengamma.master.position.PositionSearchResult; import com.opengamma.util.PoolExecutor; import com.opengamma.util.PoolExecutor.CompletionListener; /** * A {@link QuerySplittingPositionMaster} implementation that makes the underlying requests in parallel. */ public class ParallelQuerySplittingPositionMaster extends QuerySplittingPositionMaster { private static final Logger s_logger = LoggerFactory.getLogger(ParallelQuerySplittingPositionMaster.class); public ParallelQuerySplittingPositionMaster(final PositionMaster underlying) { super(underlying); } @Override protected Map<UniqueId, PositionDocument> callSplitGetRequest(final Collection<Collection<UniqueId>> requests) { return super.parallelSplitGetRequest(requests); } @Override protected PositionSearchResult callSplitSearchRequest(final Collection<PositionSearchRequest> requests) { final PositionSearchResult mergedResult = new PositionSearchResult(); final PoolExecutor.Service<PositionSearchResult> service = parallelService(new CompletionListener<PositionSearchResult>() { @Override public void success(final PositionSearchResult result) { synchronized (mergedResult) { mergeSplitSearchResult(mergedResult, result); } } @Override public void failure(final Throwable error) { s_logger.error("Caught exception", error); } }); s_logger.debug("Issuing {} parallel queries", requests.size()); long t = System.nanoTime(); for (final PositionSearchRequest request : requests) { service.execute(new Callable<PositionSearchResult>() { @Override public PositionSearchResult call() throws Exception { s_logger.debug("Requesting {} positions", request.getPositionObjectIds().size()); long t = System.nanoTime(); final PositionSearchResult result = getUnderlying().search(request); s_logger.info("{} positions queried in {}ms", request.getPositionObjectIds().size(), (double) (System.nanoTime() - t) / 1e6); return result; } }); } try { service.join(); } catch (InterruptedException e) { throw new OpenGammaRuntimeException("Interrupted", e); } s_logger.info("Finished queries for {} position in {}ms", mergedResult.getDocuments().size(), (double) (System.nanoTime() - t) / 1e6); return mergedResult; } }