Mongo CursorNotFound исключение в активном курсоре через критерии домена Grails

Я использую Grails 2.4.4, плагин mongo 3.0.2, MongoDB 2.4.10 с использованием удаленного подключения к базе данных.

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

В части нашего приложения сервисный метод выполняет итерацию более 20000 пользователей и отправляет им электронное письмо:

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

После выполнения этого для приблизительно 6000 пользователей я получаю исключение курсора 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

Я искал документацию и обнаружил, что курсор автоматически закрывается через 20 минут, и когда я подтвердил это с помощью журналов, это исключение появилось ровно через 20 минут.

Но такое поведение автоматического закрытия через 20 минут применимо для неактивного курсора, но здесь курсор активен.

ОБНОВЛЕНИЕ:

Я прочитал несколько статей и обнаружил, что это может быть проблемой тайм-аута активности активности TCP. Таким образом, мы изменили тайм-аут активности активности TCP на 2 минуты со значения по умолчанию 2 часа, но это все равно не решило проблему.

1 ответ

Решение

Похоже, проблема совместимости с MonoDB на этом сервере. Подробнее о Jira читайте подробнее https://jira.mongodb.org/browse/SERVER-18439

Надеюсь, это поможет кому-то еще!

Другие вопросы по тегам