6

Weiß jemand, warum Google Cloud Endpoint weiterhin die Exception unexpected end of stream ausgibt, bevor meine App Engine-Instanz tatsächlich erreicht wird? Ich erhalte immer den folgenden Fehler, wenn ich meinen Endpunkt anrufe. In den meisten Orten wird der Fehler nach jedem zweiten Anruf angezeigt. in seltenen anderen ist es konsistent.Google Cloud Endpoint wirft fortwährend die Ausnahme "Unerwartetes Ende des Streams"

05-06 18:32:28.335: W/System.err(11783): java.io.IOException: unexpected end of stream 
05-06 18:32:28.343: W/System.err(11783): at libcore.net.http.FixedLengthOutputStream.close(FixedLengthOutputStream.java:58) 
05-06 18:32:28.343: W/System.err(11783): at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:82) 
05-06 18:32:28.343: W/System.err(11783): at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:980) 
05-06 18:32:28.343: W/System.err(11783): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:412) 
05-06 18:32:28.343: W/System.err(11783): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:345) 
05-06 18:32:28.343: W/System.err(11783): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:463) 
… 

05-06 18:32:28.343: W/System.err(11783): at android.os.AsyncTask.finish(AsyncTask.java:631) 
05-06 18:32:28.343: W/System.err(11783): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
05-06 18:32:28.343: W/System.err(11783): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
05-06 18:32:28.343: W/System.err(11783): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-06 18:32:28.343: W/System.err(11783): at android.os.Looper.loop(Looper.java:137) 
05-06 18:32:28.343: W/System.err(11783): at android.app.ActivityThread.main(ActivityThread.java:4849) 
05-06 18:32:28.343: W/System.err(11783): at java.lang.reflect.Method.invokeNative(Native Method) 
05-06 18:32:28.343: W/System.err(11783): at java.lang.reflect.Method.invoke(Method.java:511) 
05-06 18:32:28.343: W/System.err(11783): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
05-06 18:32:28.343: W/System.err(11783): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
05-06 18:32:28.343: W/System.err(11783): at dalvik.system.NativeStart.main(Native Method) 

BTW: Ich erhalte diese Fehler auch bei kleinen Operationen wie ein Token zu überprüfen, die eine Kette von 20 bis 50 Zeichen sein könnten.

+0

Könnten Sie bitte Ihren Endpunktcode angeben? – MikO

+0

Es gibt ein offenes GAE-Problem dafür: https://code.google.com/p/googleappengine/issues/detail?id=9291 – Tom

+0

Und eine offene Google Java API Client Problem: https://code.google .com/p/google-http-java-client/issues/detail? id = 230 – Tom

Antwort

1

Ich bekomme das gleiche Problem auch, jedes andere Mal bekomme ich diese "unerwartete Ende des Stromes" IOE Ausnahme. Wie du sagst, sind keine Logs in der Appengine aufgezeichnet. Ich habe eine Klasse mit mehreren Endpunkten, aber das passiert nur einem von ihnen.

Dies ist die Struktur der Api-Methode:

@ApiMethod(name = "blablabla", httpMethod = HttpMethod.POST) 
public static ooooo createCDR(@Named("iiii") String iiii, 
     @Named("uuuu") String uuuu, @Named("cccc") Long cccc, 
     @Named("aaaa") int aaaa, User user) 
+0

Es sieht aus, dass es nicht mit der bestimmten aufgerufenen API-Methode verwandt ist. Ich habe andere ausprobiert, die in anderen Klassen gut funktionieren, aber in diesem Fall versagen sie. Der einzige Unterschied besteht darin, dass alle Endpunkte, die ordnungsgemäß funktionieren, aus Aktivitäten aufgerufen werden und diese Klasse, die die Methodenaufrufe fehlschlagen lässt, ein Handler ist, der von einem Dienst aufgerufen wird. – Miguel

+1

Ich habe eine Appengine-Problem erstellt: https://code.google.com/p/googleappengine/issues/detail?id=9291&thanks=9291&ts=1368199444 – Miguel

+0

können Sie zusätzliche Protokollierung in App-Engine-Anwendung hinzufügen, um Fehler zu erfassen und zu sehen, ob Sie kann einen Hinweis bekommen. Sehen Sie sich dieses google-Dokument mit Beispiel an, um eine Idee zu bekommen: [logging appengine] (https://developers.google.com/appengine/articles/logging) –

0

ich gleiches Problem hatte. Problem ist, dass die Kommunikation mit Endpoints NICHT auf ui/main thread laufen darf. Der einfachste Weg ist einfach AsyncTask zum Beispiel zu erstellen, wie thislike dies:

private class InsertTask extends AsyncTask<Void, Void, Void> { 
    Exception exceptionThrown = null; 
    TargetEndpoint targetEndpoint; 
    Target target; 

    public InsertMessageTask(Activity activity, TargetEndpoint targetEndpoint, Target target) { 
     this.messageEndpoint= messageEndpoint; 
     this.target= target; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      targetEndpoint.insertTarget(target).execute(); 
     } catch (IOException e) { 
      exceptionThrown = e; 
     } 

     return null; 
    } 

    protected void onPostExecute(Void arg) { 
     TheActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       if (exceptionThrown == null) 
        Toast.makeText(TheActivity.this, "Success!", Toast.LENGTH_LONG).show(); 
       else 
        Toast.makeText(TheActivity.this, "Error occured: '" + exceptionThrown.getMessage(), Toast.LENGTH_LONG).show(); 

      } 
     }); 
    } 
} 

Ich bin damit einverstanden, dass Fehlermeldung mehr angegeben sein könnte, aber es hat seinen Grund. Sie möchten keine teuren Methoden auf Ui-Thread ausführen, da es seine Leistung reduzieren kann.

Verwandte Themen