2015-04-14 7 views
8

Uso Grails 2.4.4, plug-in mongo 3.0.2, MongoDB 2.4.10 utilizzando una connessione di database remota.Mongo CursorNotFound eccezione nel cursore attivo tramite i criteri del dominio Grails

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 
     } 
    } 
} 

In una parte della nostra applicazione, un metodo di servizio itera su di un utente 20.000 e invia loro una e-mail:

Person.withCriteria {  // Line 323 
    eq("active", true) 
    order("dateJoined", "asc") 
}.each { personInstance -> 
    // Code to send an email which takes an average of 1 second 
} 

Dopo l'esecuzione di questo per un po 'di 6000 utenti, sto diventando un cursore MongoDB eccezione:

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 

ho guardato per la documentazione e ha scoperto che il cursore automaticamente ottenere chiuso in 20 minuti e quando ho confermato con i registri, questa eccezione è venuto esattamente dopo 20 minuti.

Ma questo comportamento di chiusura automatica in 20 minuti è applicabile per il cursore inattivo ma qui il cursore è attivo.

UPDATE:

ho letto alcuni articoli e ha scoperto che, questo potrebbe essere un problema di TCP timeout keepalive. Quindi abbiamo modificato il timeout keepalive TCP a 2 minuti dal valore predefinito di 2 ore, ma non risolve il problema.

risposta

Problemi correlati