2013-05-02 80 views
0

我有一個簡單的回調綁定到findAsync調用。即使數據庫中的數據是靜態的,每隔幾個請求我都會觀察到失敗。mongodb allanbank異步驅動程序回調被調用兩次

一些快速調試顯示我的回調總是被調用兩次。我的應用程序失敗的情況是由傳入我的回調中的nullMongoIterator<Document>引起的。當然,我只希望在數據準備好的時候進行一次回調(或者發生異常)。

這是預期的行爲?有什麼我可以做的,以確保我的回調只查詢完成後調用一次?

這裏是代碼片段:

collection.findAsync(
    [ 
     callback: { MongoIterator<Document> v -> 
      List data = [] 
      try { 
       while(v.hasNext()) { 
        data.add(docToJson(v.next())) 
       } 
      } finally { 
       if (v != null) v.close() 
      } 
      sendReply([ status: 'ok', data: data ]) 
     }, 
     exception: { Throwable t -> 
      sendReply([ status: 'error', message: t.message ]) 
     } 
    ] as Callback<MongoIterator<Document>>, 
    find 
) 

這裏是堆棧跟蹤:

Unexpected MongoDB Connection closed: Auth(MongoDB(43026-->localhost/127.0.0.1:27017)). Will try to reconnect. 
Reconnected to localhost/127.0.0.1:27017 
Exception in thread "MongoDB 43026<--localhost/127.0.0.1:27017" java.lang.NullPointerException: Cannot invoke method hasNext() on null object 
    at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:77) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:45) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) 
    at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:32) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:54) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112) 
    at mongoAsync$_run_closure2_closure6.doCall(mongoAsync.groovy:126) 
    at sun.reflect.GeneratedMethodAccessor54.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) 
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909) 
    at groovy.lang.Closure.call(Closure.java:411) 
    at org.codehaus.groovy.runtime.ConvertedMap.invokeCustom(ConvertedMap.java:50) 
    at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:81) 
    at com.sun.proxy.$Proxy14.callback(Unknown Source) 
    at com.allanbank.mongodb.client.AbstractReplyCallback.handle(AbstractReplyCallback.java:82) 
    at com.allanbank.mongodb.client.AbstractValidatingReplyCallback.callback(AbstractValidatingReplyCallback.java:72) 
    at com.allanbank.mongodb.client.AbstractValidatingReplyCallback.callback(AbstractValidatingReplyCallback.java:33) 
    at com.allanbank.mongodb.connection.message.ReplyHandler.reply(ReplyHandler.java:77) 
    at com.allanbank.mongodb.connection.socket.SocketConnection.reply(SocketConnection.java:560) 
    at com.allanbank.mongodb.connection.socket.SocketConnection$ReceiveRunnable.receiveOne(SocketConnection.java:735) 
    at com.allanbank.mongodb.connection.socket.SocketConnection$ReceiveRunnable.run(SocketConnection.java:683) 
    at java.lang.Thread.run(Thread.java:722) 
+0

根本沒有預料 - 你可以發送堆棧跟蹤的空回調調用(或發佈在這裏)。電子郵件地址是allanbank.com上的Robert.J.Moore – 2013-05-02 23:58:15

回答

1

感謝您的額外信息。

我很確定我發現了錯誤。

查詢的回調/迭代器之間有一個競爭,獲取處理查詢的服務器的名稱(GetMore請求需要)和接收回復。不知道他人怎麼沒有看到它。

這裏有一個打補丁的jar:[redact]。讓我知道它是否能爲您解決問題。

的1.2.2版本可與修復:http://www.allanbank.com/mongodb-async-driver/download.html

假如是的話,我將推動這一解決了明天一1.2.2。

Rob。

編輯:添加鏈接到正式版。

+0

修復了這個問題。感謝您的超級快速修復!真是驚人的軟件和支持! – jckdnk111 2013-05-03 01:41:09