2015-12-28 27 views
0

我正在使用RemoteAPI從GAE Datastore中一次獲取300個實體。AppEngine RemoteAPI SocketTimeoutException

我做線沿線的東西:

while(!(emails = getEmails()).isEmpty()) { 

    Filter filter = new FilterPredicate("email", FilterOperator.IN, emails) 
    Query query = new Query("MyEntity").setFilter(filter); 
    QueryResultIterable<Entity> result = ds.prepare(query).asQueryResultIterable(); 

    for (Entity entity : result) { 
    System.out.println(entity.getProperty("name")); 
    } 
} 

我處理類似50K電子郵件。當我第一次運行這個代碼時,它可能是3/4,然後拋出了下面的異常。現在它在單循環迭代運行後拋出它。

com.google.appengine.tools.remoteapi.RemoteApiException: remote API call: I/O error 
at com.google.appengine.tools.remoteapi.RemoteRpc.makeException(RemoteRpc.java:160) 
at com.google.appengine.tools.remoteapi.RemoteRpc.callImpl(RemoteRpc.java:104) 
at com.google.appengine.tools.remoteapi.RemoteRpc.call(RemoteRpc.java:50) 
at com.google.appengine.tools.remoteapi.RemoteDatastore.runQuery(RemoteDatastore.java:156) 
at com.google.appengine.tools.remoteapi.RemoteDatastore.handleRunQuery(RemoteDatastore.java:115) 
at com.google.appengine.tools.remoteapi.RemoteDatastore.handleDatastoreCall(RemoteDatastore.java:93) 
at com.google.appengine.tools.remoteapi.RemoteApiDelegate.makeDefaultSyncCall(RemoteApiDelegate.java:57) 
at com.google.appengine.tools.remoteapi.StandaloneRemoteApiDelegate.makeSyncCall(StandaloneRemoteApiDelegate.java:47) 
at com.google.appengine.tools.remoteapi.StandaloneRemoteApiDelegate$1.call(StandaloneRemoteApiDelegate.java:58) 
at com.google.appengine.tools.remoteapi.StandaloneRemoteApiDelegate$1.call(StandaloneRemoteApiDelegate.java:54) 
at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: java.net.SocketTimeoutException: Read timed out 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(SocketInputStream.java:152) 
at java.net.SocketInputStream.read(SocketInputStream.java:122) 
at sun.security.ssl.InputRecord.readFully(InputRecord.java:442) 
at sun.security.ssl.InputRecord.read(InputRecord.java:480) 
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934) 
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:891) 
at sun.security.ssl.AppInputStream.read(AppInputStream.java:102) 
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) 
at java.io.BufferedInputStream.read1(BufferedInputStream.java:275) 
at java.io.BufferedInputStream.read(BufferedInputStream.java:334) 
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:690) 
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1324) 
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468) 
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338) 
at com.google.appengine.repackaged.com.google.api.client.http.javanet.NetHttpResponse.<init>(NetHttpResponse.java:37) 
at com.google.appengine.repackaged.com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:94) 
at com.google.appengine.repackaged.com.google.api.client.http.HttpRequest.execute(HttpRequest.java:972) 
at com.google.appengine.tools.remoteapi.OAuthClient.post(OAuthClient.java:54) 
at com.google.appengine.tools.remoteapi.RemoteRpc.callImpl(RemoteRpc.java:102) 
... 12 more 

我找不出什麼問題,但代碼似乎是在拋出異常之前評估for()條件。

這可能是一個配額問題?配額詳細信息屏幕沒有顯示任何問題,我在文檔中找不到任何相關信息。

+0

我試過今天運行完全相同的代碼,它只是工作。我已經多次執行它(試圖弄清楚它是否與配額有關的問題),但是我無法**重現該問題。我仍然不知道問題是什麼。 –

+0

我得到這些很少,但他們很煩惱。你有沒有得到這個決議?如果可能的話,我寧願趕上這些,然後重試。 –

+0

我什麼都沒改變,第二天它只是工作。所有配額都低於限額。不知道是什麼。 :( –

回答

1

對於此問題的將來讀者,如果看到RemoteApiException: remote API call: I/O error發生的情況一致而非間歇性地發生,則可能與網絡連接中斷或App Engine端可能存在的遠程問題有關。

如果排除第一種可能性,最好的方法是報告Google App Engine issue tracker上的問題。

0

要解決此問題,首先請檢查您的Internet連接。然後清潔所有的文物和(用的IntelliJ)再次建立他們

  1. 轉到Build =>Build Artifacts...
  2. 聚焦All Artifacts =>Clean
  3. 聚焦All Artifacts =>Build