From 888ad50291839ea3245f87da13164439e403c23e Mon Sep 17 00:00:00 2001 From: John-Wiens Date: Fri, 16 Feb 2024 08:59:06 -0700 Subject: [PATCH] Added mongoDB timeout --- .../ode/api/ConflictMonitorApiProperties.java | 10 ++++ .../map/ProcessedMapRepositoryImpl.java | 47 +++++++++++++------ .../ActiveNotificationRepositoryImpl.java | 6 +-- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/jpo-conflictvisualizer-api/src/main/java/us/dot/its/jpo/ode/api/ConflictMonitorApiProperties.java b/jpo-conflictvisualizer-api/src/main/java/us/dot/its/jpo/ode/api/ConflictMonitorApiProperties.java index d68b77383..5ae438a07 100644 --- a/jpo-conflictvisualizer-api/src/main/java/us/dot/its/jpo/ode/api/ConflictMonitorApiProperties.java +++ b/jpo-conflictvisualizer-api/src/main/java/us/dot/its/jpo/ode/api/ConflictMonitorApiProperties.java @@ -74,6 +74,7 @@ public class ConflictMonitorApiProperties { private String cmServerURL = ""; private String emailBroker = ""; private String emailFromAddress = "noreply@cimms.com"; + private long mongoTimeoutMs = 5000; private int importProcessorBufferSize = OdePlugin.INPUT_STREAM_BUFFER_SIZE; private String hostId; private List uploadLocations = new ArrayList<>(); @@ -166,6 +167,15 @@ public void setEmailFromAddress(String emailFromAddress) { this.emailFromAddress = emailFromAddress; } + public long getMongoTimeoutMs() { + return mongoTimeoutMs; + } + + @Value("${mongoTimeoutMs}") + public void setMongoTimeoutMs(long mongoTimeoutMs) { + this.mongoTimeoutMs = mongoTimeoutMs; + } + public String getKafkaBrokers() { return kafkaBrokers; } diff --git a/jpo-conflictvisualizer-api/src/main/java/us/dot/its/jpo/ode/api/accessors/map/ProcessedMapRepositoryImpl.java b/jpo-conflictvisualizer-api/src/main/java/us/dot/its/jpo/ode/api/accessors/map/ProcessedMapRepositoryImpl.java index dc1559a64..28c49b139 100644 --- a/jpo-conflictvisualizer-api/src/main/java/us/dot/its/jpo/ode/api/accessors/map/ProcessedMapRepositoryImpl.java +++ b/jpo-conflictvisualizer-api/src/main/java/us/dot/its/jpo/ode/api/accessors/map/ProcessedMapRepositoryImpl.java @@ -4,9 +4,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import org.bson.Document; import org.bson.conversions.Bson; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; @@ -21,16 +24,19 @@ import org.springframework.stereotype.Component; import com.fasterxml.jackson.databind.ObjectMapper; +import com.mongodb.MongoException; import com.mongodb.client.DistinctIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.model.Projections; import com.mongodb.client.model.Sorts; + import static com.mongodb.client.model.Filters.eq; import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.ProcessedMap; import us.dot.its.jpo.ode.api.ConflictMonitorApiProperties; +import us.dot.its.jpo.ode.api.controllers.AssessmentController; import us.dot.its.jpo.ode.api.models.IDCount; import us.dot.its.jpo.ode.api.models.IntersectionReferenceData; import us.dot.its.jpo.geojsonconverter.DateJsonMapper; @@ -47,6 +53,7 @@ public class ProcessedMapRepositoryImpl implements ProcessedMapRepository { private String collectionName = "ProcessedMap"; private ObjectMapper mapper = DateJsonMapper.getInstance(); + private Logger logger = LoggerFactory.getLogger(ProcessedMapRepositoryImpl.class); public Query getQuery(Integer intersectionID, Long startTime, Long endTime, boolean latest) { Query query = new Query(); @@ -97,30 +104,40 @@ public List getIntersectionIDs() { DistinctIterable docs = collection.distinct("properties.intersectionId", Integer.class); MongoCursor results = docs.iterator(); List referenceDataList = new ArrayList<>(); - while (results.hasNext()) { Integer intersectionId = results.next(); if (intersectionId != null){ + Bson projectionFields = Projections.fields( Projections.include("properties.intersectionId", "properties.originIp", "properties.refPoint.latitude", "properties.refPoint.longitude"), Projections.excludeId()); - Document document = collection.find(eq("properties.intersectionId", intersectionId)) - .projection(projectionFields).sort(Sorts.descending("properties.timeStamp")).first(); - IntersectionReferenceData data = new IntersectionReferenceData(); - Document properties = document.get("properties", Document.class); - - if (properties != null) { - Document refPoint = properties.get("refPoint", Document.class); - data.setIntersectionID(intersectionId); - data.setRoadRegulatorID("-1"); - data.setRsuIP(properties.getString("originIp")); - if (refPoint != null) { - data.setLatitude(refPoint.getDouble("latitude")); - data.setLongitude(refPoint.getDouble("longitude")); + try { + Document document = collection.find(eq("properties.intersectionId", intersectionId)) + .projection(projectionFields).sort(Sorts.descending("properties.timeStamp")).maxTime(props.getMongoTimeoutMs(), TimeUnit.MILLISECONDS).first(); + + if(document != null){ + IntersectionReferenceData data = new IntersectionReferenceData(); + Document properties = document.get("properties", Document.class); + + if (properties != null) { + Document refPoint = properties.get("refPoint", Document.class); + data.setIntersectionID(intersectionId); + data.setRoadRegulatorID("-1"); + data.setRsuIP(properties.getString("originIp")); + if (refPoint != null) { + data.setLatitude(refPoint.getDouble("latitude")); + data.setLongitude(refPoint.getDouble("longitude")); + } + } + referenceDataList.add(data); } + } catch (MongoException e){ + logger.error("MongoDB Intersection Query Did not finish in allowed time window"); + } catch (Exception e) { + logger.error(""); } - referenceDataList.add(data); + } } diff --git a/jpo-conflictvisualizer-api/src/main/java/us/dot/its/jpo/ode/api/accessors/notifications/ActiveNotification/ActiveNotificationRepositoryImpl.java b/jpo-conflictvisualizer-api/src/main/java/us/dot/its/jpo/ode/api/accessors/notifications/ActiveNotification/ActiveNotificationRepositoryImpl.java index a304b43bf..9217c5ff4 100644 --- a/jpo-conflictvisualizer-api/src/main/java/us/dot/its/jpo/ode/api/accessors/notifications/ActiveNotification/ActiveNotificationRepositoryImpl.java +++ b/jpo-conflictvisualizer-api/src/main/java/us/dot/its/jpo/ode/api/accessors/notifications/ActiveNotification/ActiveNotificationRepositoryImpl.java @@ -34,9 +34,9 @@ public Query getQuery(Integer intersectionID, Integer roadRegulatorID, String no query.addCriteria(Criteria.where("intersectionID").is(intersectionID)); } - if(roadRegulatorID != null){ - query.addCriteria(Criteria.where("roadRegulatorID").is(roadRegulatorID)); - } + // if(roadRegulatorID != null){ + // query.addCriteria(Criteria.where("roadRegulatorID").is(roadRegulatorID)); + // } if(notificationType != null){ query.addCriteria(Criteria.where("notificationType").is(notificationType));