mongodb grails grails-2.4 gmongo

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.