Issue #2041 Improve exception handing in grid resources.
Change-Id: I9edcb10da3ec9bfce16650cbf8c480af94dc6d39 Former-commit-id:956fd6e846
[formerly5951b85ac6
] [formerly956fd6e846
[formerly5951b85ac6
] [formerly7259fdc3a8
[formerly 17334720cd9f5705687b2030b1532b342e9a6fb8]]] Former-commit-id:7259fdc3a8
Former-commit-id:d79c15be5a
[formerly8b3df5140c
] Former-commit-id:70fbbeb457
This commit is contained in:
parent
7b8c0cd36c
commit
4fab8e711d
2 changed files with 100 additions and 12 deletions
|
@ -45,7 +45,9 @@ import com.raytheon.uf.viz.core.exception.VizException;
|
||||||
*
|
*
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Mar 16, 2011 bsteffen Initial creation
|
* Mar 16, 2011 bsteffen Initial creation
|
||||||
|
* Jun 04, 2013 2041 bsteffen Improve exception handing in grid
|
||||||
|
* resources.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -65,6 +67,12 @@ class GridDataRequestJob extends Job {
|
||||||
|
|
||||||
public List<GeneralGridData> gridData;
|
public List<GeneralGridData> gridData;
|
||||||
|
|
||||||
|
public VizException exception;
|
||||||
|
|
||||||
|
// True only if exception has already been handled(i.e. the user has
|
||||||
|
// been notified.)
|
||||||
|
public boolean exceptionHandled = false;
|
||||||
|
|
||||||
public GridDataRequest(DataTime time, List<PluginDataObject> pdos) {
|
public GridDataRequest(DataTime time, List<PluginDataObject> pdos) {
|
||||||
this.time = time;
|
this.time = time;
|
||||||
if (pdos == null) {
|
if (pdos == null) {
|
||||||
|
@ -75,6 +83,10 @@ class GridDataRequestJob extends Job {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean shouldRequest() {
|
||||||
|
return gridData == null && exception == null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private AbstractGridResource<?> resource;
|
private AbstractGridResource<?> resource;
|
||||||
|
@ -97,14 +109,12 @@ class GridDataRequestJob extends Job {
|
||||||
synchronized (requests) {
|
synchronized (requests) {
|
||||||
requests.remove(request);
|
requests.remove(request);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
resource.issueRefresh();
|
||||||
}
|
}
|
||||||
resource.issueRefresh();
|
|
||||||
} catch (VizException e) {
|
} catch (VizException e) {
|
||||||
synchronized (requests) {
|
request.exception = e;
|
||||||
requests.remove(request);
|
resource.issueRefresh();
|
||||||
}
|
|
||||||
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
|
|
||||||
e);
|
|
||||||
}
|
}
|
||||||
if (monitor.isCanceled()) {
|
if (monitor.isCanceled()) {
|
||||||
break;
|
break;
|
||||||
|
@ -116,7 +126,7 @@ class GridDataRequestJob extends Job {
|
||||||
protected GridDataRequest getNext() {
|
protected GridDataRequest getNext() {
|
||||||
synchronized (requests) {
|
synchronized (requests) {
|
||||||
for (GridDataRequest request : requests) {
|
for (GridDataRequest request : requests) {
|
||||||
if (request.gridData == null) {
|
if (request.shouldRequest()) {
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -126,8 +136,8 @@ class GridDataRequestJob extends Job {
|
||||||
|
|
||||||
public List<GeneralGridData> requestData(DataTime time,
|
public List<GeneralGridData> requestData(DataTime time,
|
||||||
List<PluginDataObject> pdos) {
|
List<PluginDataObject> pdos) {
|
||||||
|
GridDataRequest request = new GridDataRequest(time, pdos);
|
||||||
synchronized (requests) {
|
synchronized (requests) {
|
||||||
GridDataRequest request = new GridDataRequest(time, pdos);
|
|
||||||
Iterator<GridDataRequest> itr = requests.iterator();
|
Iterator<GridDataRequest> itr = requests.iterator();
|
||||||
while (itr.hasNext()) {
|
while (itr.hasNext()) {
|
||||||
GridDataRequest r = itr.next();
|
GridDataRequest r = itr.next();
|
||||||
|
@ -143,11 +153,87 @@ class GridDataRequestJob extends Job {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
requests.add(0, request);
|
requests.add(0, request);
|
||||||
|
if (request.exception != null && !request.exceptionHandled) {
|
||||||
|
handleExceptions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (request.shouldRequest()) {
|
||||||
|
this.schedule();
|
||||||
}
|
}
|
||||||
this.schedule();
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handleExceptions() {
|
||||||
|
|
||||||
|
List<GridDataRequest> failedRequests = new ArrayList<GridDataRequest>(
|
||||||
|
requests.size());
|
||||||
|
synchronized (requests) {
|
||||||
|
for (GridDataRequest request : requests) {
|
||||||
|
if (request.exception != null && !request.exceptionHandled) {
|
||||||
|
failedRequests.add(request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (failedRequests.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String safeResourceName = "Grid Resource";
|
||||||
|
try {
|
||||||
|
safeResourceName = resource.getName();
|
||||||
|
} catch (Throwable e) {
|
||||||
|
// This means they just won't get
|
||||||
|
// as useful of a message.
|
||||||
|
statusHandler.handle(Priority.DEBUG, e.getLocalizedMessage(), e);
|
||||||
|
}
|
||||||
|
boolean multiple = failedRequests.size() > 1;
|
||||||
|
GridDataRequest request = failedRequests.get(0);
|
||||||
|
// Only log one message as a PROBLEM
|
||||||
|
statusHandler.handle(Priority.PROBLEM,
|
||||||
|
getFailureMessage(safeResourceName, request, multiple),
|
||||||
|
request.exception);
|
||||||
|
if (multiple) {
|
||||||
|
// Log all other messages as INFO so that if there are differences
|
||||||
|
// they will be in the log.
|
||||||
|
for (GridDataRequest r : failedRequests) {
|
||||||
|
statusHandler.handle(Priority.INFO,
|
||||||
|
getFailureMessage(safeResourceName, r, false),
|
||||||
|
r.exception);
|
||||||
|
r.exceptionHandled = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
request.exceptionHandled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempt to generate a pretty message to display to the user.
|
||||||
|
*
|
||||||
|
* @param resourceName
|
||||||
|
* the name of the resource
|
||||||
|
* @param request
|
||||||
|
* a failed request
|
||||||
|
* @param multiple
|
||||||
|
* whether this message should be for the current request or
|
||||||
|
* multiple frames.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String getFailureMessage(String resourceName,
|
||||||
|
GridDataRequest request, boolean multiple) {
|
||||||
|
StringBuilder message = new StringBuilder("Error requesting data for ");
|
||||||
|
message.append(resourceName);
|
||||||
|
if (multiple) {
|
||||||
|
message.append(" Multiple frames");
|
||||||
|
} else if (request.time != null) {
|
||||||
|
message.append(" ").append(request.time.getLegendString());
|
||||||
|
}
|
||||||
|
if (request.exception != null) {
|
||||||
|
message.append(": ");
|
||||||
|
message.append(request.exception.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return message.toString();
|
||||||
|
}
|
||||||
|
|
||||||
public void remove(DataTime time) {
|
public void remove(DataTime time) {
|
||||||
synchronized (requests) {
|
synchronized (requests) {
|
||||||
Iterator<GridDataRequest> itr = requests.iterator();
|
Iterator<GridDataRequest> itr = requests.iterator();
|
||||||
|
|
|
@ -78,7 +78,9 @@ import com.raytheon.viz.grid.record.RequestableDataRecord;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Mar 16, 2009 brockwoo Initial creation
|
* Mar 16, 2009 brockwoo Initial creation
|
||||||
* Nov 21, 2009 #3576 rjpeter Refactored use of DerivParamDesc.
|
* Nov 21, 2009 3576 rjpeter Refactored use of DerivParamDesc.
|
||||||
|
* Jun 04, 2013 2041 bsteffen Improve exception handing in grid
|
||||||
|
* resources.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author brockwoo
|
* @author brockwoo
|
||||||
|
@ -367,7 +369,7 @@ public class GridDataCubeAdapter extends AbstractDataCubeAdapter {
|
||||||
records = getRecord(obj, requests);
|
records = getRecord(obj, requests);
|
||||||
}
|
}
|
||||||
} catch (VizException e) {
|
} catch (VizException e) {
|
||||||
throw new VizDataCubeException(e);
|
throw new VizDataCubeException(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
records = getRecord(obj, req, dataset);
|
records = getRecord(obj, req, dataset);
|
||||||
|
|
Loading…
Add table
Reference in a new issue