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