All: I have been fighting these issues for some time and have
narrowed it down to the below chunk of code.
Based on the log file attached the error occurs randomly at the
lines of code below labeled Error here in trace
You will see a number of calls to collection.features().close()
commented out. If I enable those, I get a ton
of errors about the socket already being closed. I have tried
enabling different combinations of the call to close
and get basically the same results.
The near random nature of this occurring if you look at the trace
appears to be some sort of connection or
thread pool timing issue based on reuse.
Has anyone of the list seen this error. I am using Accumulo
1.7.2 and Geomesa 1.3.1.
private boolean
updateFeatureIfExists(String featuresetname, CoalesceRecord
record)
throws IOException, CQLException,
CoalesceDataFormatException
{
boolean updated = false;
SimpleFeatureStore store = (SimpleFeatureStore)
connect.getGeoDataStore().getFeatureSource(featuresetname);
FilterFactory2 ff =
CommonFactoryFinder.getFilterFactory2();
FeatureId fid =ff.featureId(record.getKey());
// TODO Need to add compare of modified time to see if
there was an update
Filter filter = ff.id(Collections.singleton(fid));
// Need to escape the fully qualified column in the
feature set for filters
//Filter filter =
CQL.toFilter("\""+featuresetname+".recordKey\" =" + "'" +
record.getKey() + "'");
SimpleFeatureCollection collection =
store.getFeatures(filter);
int size = collection.size();
boolean hasNext =
collection.features().hasNext(); <<<<< Error
here in trace
LOGGER.info("Entity Collection size: {} hasNext:
{}",size,hasNext);
if (hasNext )
{
SimpleFeature thefeature =
collection.features().next(); <<< Error here in
trace
//LOGGER.info("Features found:
{}",collection.size());
//collection.features().close();
// Transactions not supported by GEOMESA
Transaction transaction = new DefaultTransaction();
store.setTransaction(transaction);
List<String> fieldNames = new
ArrayList<String>();
List<Object> fieldVals = new ArrayList();
String liststring;
for (CoalesceField<?> field :
record.getFields())
{
// update
//store.modifyFeatures(field.getName(),
field.getValue(), filter);
fieldNames.add(field.getName());
Object fieldvalue = field.getValue();
switch (field.getDataType()) {
// These types should be able to be handled
directly
case BOOLEAN_TYPE:
case DOUBLE_TYPE:
case FLOAT_TYPE:
case INTEGER_TYPE:
case LONG_TYPE:
case STRING_TYPE:
case URI_TYPE:
case LINE_STRING_TYPE:
case POLYGON_TYPE:
fieldVals.add(fieldvalue);
break;
case STRING_LIST_TYPE:
liststring = Arrays.toString((String[])
fieldvalue);
fieldVals.add(liststring);
break;
case DOUBLE_LIST_TYPE:
liststring = Arrays.toString((double[])
fieldvalue);
fieldVals.add(liststring);
break;
case INTEGER_LIST_TYPE:
liststring = Arrays.toString((int[])
fieldvalue);
fieldVals.add(liststring);
break;
case LONG_LIST_TYPE:
liststring = Arrays.toString((long[])
fieldvalue);
fieldVals.add(liststring);
break;
case FLOAT_LIST_TYPE:
liststring = Arrays.toString((float[])
fieldvalue);
fieldVals.add(liststring);
break;
case GUID_LIST_TYPE:
liststring = Arrays.toString((UUID[])
fieldvalue);
fieldVals.add(liststring);
break;
case BOOLEAN_LIST_TYPE:
liststring = Arrays.toString((boolean[])
fieldvalue);
fieldVals.add(liststring);
break;
case GUID_TYPE:
String guid = ((UUID)
fieldvalue).toString();
fieldVals.add(guid);
break;
case GEOCOORDINATE_LIST_TYPE:
MultiPoint points = new
GeometryFactory().createMultiPoint((Coordinate[]) fieldvalue);
fieldVals.add(points);
break;
case GEOCOORDINATE_TYPE:
Point point = new
GeometryFactory().createPoint((Coordinate) fieldvalue);
fieldVals.add(point);
break;
// Circles will be converted to polygons
case CIRCLE_TYPE:
// Create Polygon
CoalesceCircle circle = (CoalesceCircle)
fieldvalue;
GeometricShapeFactory factory = new
GeometricShapeFactory();
factory.setSize(circle.getRadius());
factory.setNumPoints(360); // 1 degree
points
factory.setCentre(circle.getCenter());
Polygon shape = factory.createCircle();
fieldVals.add(shape);
break;
case DATE_TIME_TYPE:
fieldVals.add (((DateTime)
fieldvalue).toDate());
break;
case FILE_TYPE:
case BINARY_TYPE:
default:
break;
}
}
try {
store.modifyFeatures( fieldNames.toArray(new
String[fieldNames.size()]), fieldVals.toArray(), filter);
} catch (IllegalArgumentException e)
{
LOGGER.error(e.getMessage(), e);
updated = false;
return updated;
}
updated = true;
transaction.commit();
transaction.close();
} //else {
// collection.features().close();
// }
return updated;
}
private boolean updateLinkIfExists(String featuresetname,
CoalesceLinkage link)
throws IOException, CQLException,
CoalesceDataFormatException
{
boolean updated = false;
SimpleFeatureStore store = (SimpleFeatureStore)
connect.getGeoDataStore().getFeatureSource(featuresetname);
FilterFactory2 ff =
CommonFactoryFinder.getFilterFactory2();
FeatureId fid =ff.featureId(link.getKey());
Filter filter = ff.id(Collections.singleton(fid));
// Need to escape the fully qualified column in the
feature set for filters
//Filter filter =
CQL.toFilter("\""+featuresetname+".recordKey\" =" + "'" +
record.getKey() + "'");
SimpleFeatureCollection collection =
store.getFeatures(filter);
int size = collection.size();
boolean hasNext =
collection.features().hasNext(); <<< Error here in trace
LOGGER.info("Linkage Collection size: {} hasNext:
{}",size,hasNext);
if (hasNext)
{
//LOGGER.info("Found Linkages:
{}",collection.size());
SimpleFeature thefeature =
collection.features().next(); <<<
Error here in trace
// if (collection.features().hasNext()) {
// collection.features().close();
// }
// Transactions not supported by GEOMESA
Transaction transaction = new DefaultTransaction();
store.setTransaction(transaction);
//SimpleFeature thefeature =
collection.features().next();
final String linkfields[] = {
LINKAGE_ENTITY1_KEY_COLUMN_NAME,
LINKAGE_ENTITY1_NAME_COLUMN_NAME,
LINKAGE_ENTITY1_SOURCE_COLUMN_NAME,
LINKAGE_ENTITY1_VERSION_COLUMN_NAME,
LINKAGE_ENTITY2_KEY_COLUMN_NAME,
LINKAGE_ENTITY2_NAME_COLUMN_NAME,
LINKAGE_ENTITY2_SOURCE_COLUMN_NAME,
LINKAGE_ENTITY2_VERSION_COLUMN_NAME,
LINKAGE_LAST_MODIFIED_COLUMN_NAME,
LINKAGE_LABEL_COLUMN_NAME,
LINKAGE_LINK_TYPE_COLUMN_NAME
};
Object[] values = new Object[] {
link.getEntity1Key(),
link.getEntity1Name(),
link.getEntity1Source(),
link.getEntity1Version(),
link.getEntity2Key(),
link.getEntity2Name(),
link.getEntity2Source(),
link.getEntity2Version(),
link.getLastModified(),
link.getLabel(),
link.getLinkType()
};
store.modifyFeatures(linkfields, values, filter);
updated = true;
transaction.commit();
transaction.close();
} //else {
// collection.features().close();
// }
return updated;
}
--
========= mailto:dboyd@xxxxxxxxxxxxxxxxx ============
David W. Boyd
VP, Data Solutions
10432 Balls Ford, Suite 240
Manassas, VA 20109
office: +1-703-552-2862
cell: +1-703-402-7908
============== http://www.incadencecorp.com/ ============
ISO/IEC JTC1 WG9, editor ISO/IEC 20547 Big Data Reference Architecture
Chair ANSI/INCITS TC Big Data
Co-chair NIST Big Data Public Working Group Reference Architecture
First Robotic Mentor - FRC, FTC - www.iliterobotics.org
Board Member- USSTEM Foundation - www.usstem.org
The information contained in this message may be privileged
and/or confidential and protected from disclosure.
If the reader of this message is not the intended recipient
or an employee or agent responsible for delivering this message
to the intended recipient, you are hereby notified that any
dissemination, distribution or copying of this communication
is strictly prohibited. If you have received this communication
in error, please notify the sender immediately by replying to
this message and deleting the material from any computer.
|