Omaha #3668 grid data request uses thread pool
Change-Id: I75023960c89f18b87e1bce5a2063c0c6212005ac Former-commit-id:48352e964d
[formerly66705190b5
] [formerly42cefd3655
[formerly ccd1d646a175e6a2493def2fb3a22d7109e225a7]] Former-commit-id:42cefd3655
Former-commit-id:574005859a
This commit is contained in:
parent
bcf1265a16
commit
64a3e0898c
2 changed files with 51 additions and 20 deletions
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Reference in a new issue