Omaha #3668 grid data request uses thread pool

Change-Id: I75023960c89f18b87e1bce5a2063c0c6212005ac

Former-commit-id: 42cefd3655 [formerly 48352e964d [formerly 66705190b5] [formerly 42cefd3655 [formerly ccd1d646a175e6a2493def2fb3a22d7109e225a7]]]
Former-commit-id: 48352e964d [formerly 66705190b5]
Former-commit-id: 48352e964d
Former-commit-id: 0cd0db130c
This commit is contained in:
Brian Clements 2014-10-07 13:28:34 -05:00
parent 772969f5c8
commit 627ed89ca2
2 changed files with 51 additions and 20 deletions

View file

@ -130,6 +130,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* instead of raw float data. * instead of raw float data.
* Feb 28, 2014 2791 bsteffen Switch all data to use data source. * Feb 28, 2014 2791 bsteffen Switch all data to use data source.
* Aug 21, 2014 DR 17313 jgerth Implements ImageProvider * Aug 21, 2014 DR 17313 jgerth Implements ImageProvider
* Oct 07, 2014 3668 bclement Renamed requestJob to requestRunner
* *
* </pre> * </pre>
* *
@ -156,7 +157,7 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
public static final String INTERROGATE_DIRECTION = "direction"; public static final String INTERROGATE_DIRECTION = "direction";
private final GridDataRequestJob requestJob; private final GridDataRequestRunner requestRunner;
private Map<DataTime, List<PluginDataObject>> pdoMap = new ConcurrentHashMap<DataTime, List<PluginDataObject>>(); private Map<DataTime, List<PluginDataObject>> pdoMap = new ConcurrentHashMap<DataTime, List<PluginDataObject>>();
@ -214,7 +215,7 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
} }
}); });
dataTimes = new ArrayList<DataTime>(); dataTimes = new ArrayList<DataTime>();
requestJob = new GridDataRequestJob(this); requestRunner = new GridDataRequestRunner(this);
// Capabilities need to be inited in construction for things like the // Capabilities need to be inited in construction for things like the
// image combination tool. // image combination tool.
initCapabilities(); initCapabilities();
@ -254,7 +255,7 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
} }
} }
} }
requestJob.remove(time); requestRunner.remove(time);
dataMap.remove(time); dataMap.remove(time);
if (!dataTimes.contains(dataTimes)) { if (!dataTimes.contains(dataTimes)) {
dataTimes.add(time); dataTimes.add(time);
@ -643,10 +644,10 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
List<PluginDataObject> pdos) throws VizException; List<PluginDataObject> pdos) throws VizException;
protected List<GeneralGridData> requestData(DataTime time) { protected List<GeneralGridData> requestData(DataTime time) {
synchronized (requestJob) { synchronized (requestRunner) {
List<GeneralGridData> data = this.dataMap.get(time); List<GeneralGridData> data = this.dataMap.get(time);
if (data == null) { if (data == null) {
data = requestJob.requestData(time, pdoMap.get(time)); data = requestRunner.requestData(time, pdoMap.get(time));
if (data != null) { if (data != null) {
data = mergeData(data); data = mergeData(data);
this.dataMap.put(time, data); this.dataMap.put(time, data);
@ -898,7 +899,7 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
public void remove(DataTime dataTime) { public void remove(DataTime dataTime) {
pdoMap.remove(dataTime); pdoMap.remove(dataTime);
dataMap.remove(dataTime); dataMap.remove(dataTime);
requestJob.remove(dataTime); requestRunner.remove(dataTime);
dataTimes.remove(dataTime); dataTimes.remove(dataTime);
synchronized (renderableMap) { synchronized (renderableMap) {
List<IRenderable> renderableList = renderableMap.remove(dataTime); List<IRenderable> renderableList = renderableMap.remove(dataTime);
@ -940,7 +941,7 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
* *
*/ */
protected void clearRequestedData() { protected void clearRequestedData() {
requestJob.stopAndClear(); requestRunner.stopAndClear();
synchronized (renderableMap) { synchronized (renderableMap) {
for (List<IRenderable> renderableList : renderableMap.values()) { for (List<IRenderable> renderableList : renderableMap.values()) {
for (IRenderable renderable : renderableList) { for (IRenderable renderable : renderableList) {

View file

@ -22,11 +22,8 @@ package com.raytheon.viz.grid.rsc.general;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.concurrent.Executor;
import org.eclipse.core.runtime.IProgressMonitor; import java.util.concurrent.Executors;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.IUFStatusHandler;
@ -37,7 +34,7 @@ import com.raytheon.uf.viz.core.exception.VizException;
/** /**
* *
* A Job for asynchronously requesting data for GridResources. * Manages asynchronously requesting data for GridResources.
* *
* <pre> * <pre>
* *
@ -49,16 +46,24 @@ import com.raytheon.uf.viz.core.exception.VizException;
* Jun 04, 2013 2041 bsteffen Improve exception handing in grid * Jun 04, 2013 2041 bsteffen Improve exception handing in grid
* resources. * resources.
* Jun 24, 2013 2140 randerso Moved safe name code into AbstractVizResource * Jun 24, 2013 2140 randerso Moved safe name code into AbstractVizResource
* Oct 07, 2014 3668 bclement uses executor instead of eclipse job
* renamed to GridDataRequestRunner
* *
* </pre> * </pre>
* *
* @author bsteffen * @author bsteffen
* @version 1.0 * @version 1.0
*/ */
class GridDataRequestJob extends Job { class GridDataRequestRunner implements Runnable {
private static final int POOL_SIZE = Integer.getInteger(
"grid.request.pool.size", 10);
private static final Executor executor = Executors
.newFixedThreadPool(POOL_SIZE);
private static final transient IUFStatusHandler statusHandler = UFStatus private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(GridDataRequestJob.class); .getHandler(GridDataRequestRunner.class);
private static class GridDataRequest { private static class GridDataRequest {
@ -90,17 +95,18 @@ class GridDataRequestJob extends Job {
} }
private volatile boolean cancelled = false;
private AbstractGridResource<?> resource; private AbstractGridResource<?> resource;
private List<GridDataRequest> requests = new ArrayList<GridDataRequest>(); private List<GridDataRequest> requests = new ArrayList<GridDataRequest>();
public GridDataRequestJob(AbstractGridResource<?> resource) { public GridDataRequestRunner(AbstractGridResource<?> resource) {
super("Requesting Gridded Data");
this.resource = resource; this.resource = resource;
} }
@Override @Override
protected IStatus run(IProgressMonitor monitor) { public void run() {
for (GridDataRequest request = getNext(); request != null; request = getNext()) { for (GridDataRequest request = getNext(); request != null; request = getNext()) {
try { try {
request.gridData = resource.getData(request.time, request.pdos); request.gridData = resource.getData(request.time, request.pdos);
@ -117,13 +123,17 @@ class GridDataRequestJob extends Job {
request.exception = e; request.exception = e;
resource.issueRefresh(); resource.issueRefresh();
} }
if (monitor.isCanceled()) { if (cancelled) {
break; break;
} }
} }
return Status.OK_STATUS;
} }
/**
* Get the next request that should be sent
*
* @return null if no request should be sent
*/
protected GridDataRequest getNext() { protected GridDataRequest getNext() {
synchronized (requests) { synchronized (requests) {
for (GridDataRequest request : requests) { for (GridDataRequest request : requests) {
@ -135,6 +145,11 @@ class GridDataRequestJob extends Job {
return null; return null;
} }
/**
* @param time
* @param pdos
* @return null if no requests matching time have been fulfilled
*/
public List<GeneralGridData> requestData(DataTime time, public List<GeneralGridData> requestData(DataTime time,
List<PluginDataObject> pdos) { List<PluginDataObject> pdos) {
GridDataRequest request = new GridDataRequest(time, pdos); GridDataRequest request = new GridDataRequest(time, pdos);
@ -164,6 +179,14 @@ class GridDataRequestJob extends Job {
return null; return null;
} }
/**
* send current requests
*/
private void schedule() {
cancelled = false;
executor.execute(this);
}
private void handleExceptions() { private void handleExceptions() {
List<GridDataRequest> failedRequests = new ArrayList<GridDataRequest>( List<GridDataRequest> failedRequests = new ArrayList<GridDataRequest>(
@ -247,4 +270,11 @@ class GridDataRequestJob extends Job {
this.cancel(); this.cancel();
} }
/**
* cancel current request
*/
private void cancel() {
cancelled = true;
}
} }