mongodb - Mongo CursorNotFound excepción en el cursor activo a través de los criterios del dominio Grails
grails-2.4 gmongo (1)
Parece un problema de compatibilidad con MonoDB en este servidor. Lea más sobre el Jira para más detalles https://jira.mongodb.org/browse/SERVER-18439
Espero que esto ayude a otra persona!
Estoy usando Grails 2.4.4, mongo plugin 3.0.2, MongoDB 2.4.10 usando una conexión de base de datos remota.
grails {
mongo {
host = "11.12.13.14" // A remote server IP
port = 27017
databaseName = "blogger"
username = "blog"
password = "xyz"
options {
autoConnectRetry = true
connectTimeout = 3000
connectionsPerHost = 40
socketTimeout = 120000
threadsAllowedToBlockForConnectionMultiplier = 5
maxAutoConnectRetryTime=5
maxWaitTime=120000
}
}
}
En una parte de nuestra aplicación, un método de servicio repite más de 20,000 usuarios y les envía un correo electrónico:
Person.withCriteria { // Line 323
eq("active", true)
order("dateJoined", "asc")
}.each { personInstance ->
// Code to send an email which takes an average of 1 second
}
Después de ejecutar esto para unos 6000 usuarios, recibo una excepción de cursor MongoDB:
2015-04-11 07:31:14,218 [quartzScheduler_Worker-1] ERROR listeners.ExceptionPrinterJobListener - Exception occurred in job: Grails Job
org.quartz.JobExecutionException: com.mongodb.MongoException$CursorNotFound: Cursor 1337814790631604331 not found on server 11.12.13.14:27017 [See nested exception: com.mongodb.MongoException$CursorNotFound: Cursor 1337814790631604331 not found on server 11.12.13.14:27017]
at grails.plugins.quartz.GrailsJobFactory$GrailsJob.execute(GrailsJobFactory.java:111)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: com.mongodb.MongoException$CursorNotFound: Cursor 1337814790631604331 not found on server 11.12.13.14:27017
at com.mongodb.QueryResultIterator.throwOnQueryFailure(QueryResultIterator.java:218)
at com.mongodb.QueryResultIterator.init(QueryResultIterator.java:198)
at com.mongodb.QueryResultIterator.initFromQueryResponse(QueryResultIterator.java:176)
at com.mongodb.QueryResultIterator.getMore(QueryResultIterator.java:141)
at com.mongodb.QueryResultIterator.hasNext(QueryResultIterator.java:127)
at com.mongodb.DBCursor._hasNext(DBCursor.java:551)
at com.mongodb.DBCursor.hasNext(DBCursor.java:571)
at org.grails.datastore.mapping.mongo.query.MongoQuery$MongoResultList$1.hasNext(MongoQuery.java:1893)
at com.test.person.PersonService.sendWeeklyEmail(PersonService.groovy:323)
at com.test.WeeklyJob.execute(WeeklyJob.groovy:41)
at grails.plugins.quartz.GrailsJobFactory$GrailsJob.execute(GrailsJobFactory.java:104)
... 2 more
Busqué la documentación y descubrí que el cursor se cierra automáticamente en 20 minutos y cuando lo confirmé con los registros, esta excepción se produjo exactamente después de 20 minutos.
Pero este comportamiento de cierre automático en 20 minutos es aplicable para el cursor inactivo, pero aquí el cursor está activo.
ACTUALIZAR :
Leí algunos artículos y descubrí que esto podría ser un problema de tiempo de espera TCP keepalive. Así que cambiamos el tiempo de espera TCP keepalive a 2 minutos desde el valor predeterminado de 2 horas, pero aún no resuelve el problema.