Omaha #3668 grid data request uses thread pool

Change-Id: I75023960c89f18b87e1bce5a2063c0c6212005ac

Former-commit-id: 48352e964d [formerly 66705190b5] [formerly 42cefd3655 [formerly ccd1d646a175e6a2493def2fb3a22d7109e225a7]]
Former-commit-id: 42cefd3655
Former-commit-id: 574005859a
This commit is contained in:
Brian Clements 2014-10-07 13:28:34 -05:00
parent bcf1265a16
commit 64a3e0898c
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.
* Feb 28, 2014 2791 bsteffen Switch all data to use data source.
* Aug 21, 2014 DR 17313 jgerth Implements ImageProvider
* Oct 07, 2014 3668 bclement Renamed requestJob to requestRunner
*
* </pre>
*
@ -156,7 +157,7 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
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>>();
@ -214,7 +215,7 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
}
});
dataTimes = new ArrayList<DataTime>();
requestJob = new GridDataRequestJob(this);
requestRunner = new GridDataRequestRunner(this);
// Capabilities need to be inited in construction for things like the
// image combination tool.
initCapabilities();
@ -254,7 +255,7 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
}
}
}
requestJob.remove(time);
requestRunner.remove(time);
dataMap.remove(time);
if (!dataTimes.contains(dataTimes)) {
dataTimes.add(time);
@ -643,10 +644,10 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
List<PluginDataObject> pdos) throws VizException;
protected List<GeneralGridData> requestData(DataTime time) {
synchronized (requestJob) {
synchronized (requestRunner) {
List<GeneralGridData> data = this.dataMap.get(time);
if (data == null) {
data = requestJob.requestData(time, pdoMap.get(time));
data = requestRunner.requestData(time, pdoMap.get(time));
if (data != null) {
data = mergeData(data);
this.dataMap.put(time, data);
@ -898,7 +899,7 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
public void remove(DataTime dataTime) {
pdoMap.remove(dataTime);
dataMap.remove(dataTime);
requestJob.remove(dataTime);
requestRunner.remove(dataTime);
dataTimes.remove(dataTime);
synchronized (renderableMap) {
List<IRenderable> renderableList = renderableMap.remove(dataTime);
@ -940,7 +941,7 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
*
*/
protected void clearRequestedData() {
requestJob.stopAndClear();
requestRunner.stopAndClear();
synchronized (renderableMap) {
for (List<IRenderable> renderableList : renderableMap.values()) {
for (IRenderable renderable : renderableList) {

View file

@ -22,11 +22,8 @@ package com.raytheon.viz.grid.rsc.general;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
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>
*
@ -49,16 +46,24 @@ import com.raytheon.uf.viz.core.exception.VizException;
* Jun 04, 2013 2041 bsteffen Improve exception handing in grid
* resources.
* 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>
*
* @author bsteffen
* @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
.getHandler(GridDataRequestJob.class);
.getHandler(GridDataRequestRunner.class);
private static class GridDataRequest {
@ -90,17 +95,18 @@ class GridDataRequestJob extends Job {
}
private volatile boolean cancelled = false;
private AbstractGridResource<?> resource;
private List<GridDataRequest> requests = new ArrayList<GridDataRequest>();
public GridDataRequestJob(AbstractGridResource<?> resource) {
super("Requesting Gridded Data");
public GridDataRequestRunner(AbstractGridResource<?> resource) {
this.resource = resource;
}
@Override
protected IStatus run(IProgressMonitor monitor) {
public void run() {
for (GridDataRequest request = getNext(); request != null; request = getNext()) {
try {
request.gridData = resource.getData(request.time, request.pdos);
@ -117,13 +123,17 @@ class GridDataRequestJob extends Job {
request.exception = e;
resource.issueRefresh();
}
if (monitor.isCanceled()) {
if (cancelled) {
break;
}
}
return Status.OK_STATUS;
}
/**
* Get the next request that should be sent
*
* @return null if no request should be sent
*/
protected GridDataRequest getNext() {
synchronized (requests) {
for (GridDataRequest request : requests) {
@ -135,6 +145,11 @@ class GridDataRequestJob extends Job {
return null;
}
/**
* @param time
* @param pdos
* @return null if no requests matching time have been fulfilled
*/
public List<GeneralGridData> requestData(DataTime time,
List<PluginDataObject> pdos) {
GridDataRequest request = new GridDataRequest(time, pdos);
@ -164,6 +179,14 @@ class GridDataRequestJob extends Job {
return null;
}
/**
* send current requests
*/
private void schedule() {
cancelled = false;
executor.execute(this);
}
private void handleExceptions() {
List<GridDataRequest> failedRequests = new ArrayList<GridDataRequest>(
@ -247,4 +270,11 @@ class GridDataRequestJob extends Job {
this.cancel();
}
/**
* cancel current request
*/
private void cancel() {
cancelled = true;
}
}