2012-03-29 10 views
16

Ich habe ein Programm, das javax.xml.ws.Service verwendet, um einen Remote-Dienst aufzurufen, der von einer WSDL definiert wird. Dieses Programm wird in der Google App Engine ausgeführt, die das HTTP-Verbindungstimeout standardmäßig auf 5 Sekunden {1} setzt. Ich muss diesen Zeitüberschreitungswert erhöhen, da dieser Dienst oft lange braucht, um zu antworten, aber da diese Anfrage nicht mit URLConnection erfolgt, kann ich nicht herausfinden, wie ich URLConnection.setReadTimeout(int) {2} aufrufen oder das Timeout anderweitig ändern kann.Kann ich das Timeout von HTTP-Verbindungen global festlegen?

Gibt es eine Möglichkeit, das HTTP-Verbindungstimeout auf der App Engine global festzulegen? Und wie würde man zum Zwecke des Wissensaustauschs generell solche Probleme lösen?

{1}: https://developers.google.com/appengine/docs/java/urlfetch/overview#Requests

{2}: http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLConnection.html#setReadTimeout(int)

Antwort

4

Siehe https://developers.google.com/appengine/docs/java/urlfetch/usingjavanet

Sie können so etwas tun, um eine URLConnection zu bekommen:

URL url = new URL("http://www.example.com/atom.xml"); 
    URLConnection tempConnection = url.openConnection(); 
    tempConnection.setReadTimeout(10); 
+0

Das ganze Problem ist, dass ein 'URLConnection' Objekt ist nie für mich verfügbar. Die Anfrage wird in einer undurchsichtigen Weise gemacht, die 'javax.xml.ws.Service' verwendet. –

8

Try this:

Port port = service.getPort(endPointInterface); //or another "getPort(...)" 
((BindingProvider) port).getRequestContext() 
    .put(BindingProviderProperties.REQUEST_TIMEOUT, 30); 
+0

Ich habe das noch nicht versucht, aber Sie erhalten das Kopfgeld, um eine Antwort zu liefern, die ich noch nirgendwo anders gesehen habe. –

12

Sie könnten versuchen, die sun.net.client.defaultConnectTimeout und sun.net.client.defaultReadTimeout Systemeigenschaften dokumentiert here, z.

System.setProperty("sun.net.client.defaultReadTimeout", "30000"); 
System.setProperty("sun.net.client.defaultConnectTimeout", "30000"); 

EDIT

Sorry, gerade wieder gelesen und bemerkt, ist dies auf Google App Engine. Ich weiß es nicht genau, aber angesichts der strittigen Beziehung, die Google und Oracle in letzter Zeit haben, vermute ich, dass GAE die Oracle JVM nicht betreibt. Ich lasse das hier für den Fall, dass jemand anderes auf ein ähnliches Problem stößt.

+0

Link zur Dokumentation: http://docs.oracle.com/javase/6/docs/technotes/guides/net/properties.html –

1

Für App Engine mit JAX-WS müssen Sie den Anforderungskontext festlegen (getestet heute mit SDK 1.9.15). Für normale Maschinen können Sie nicht höher als 60s gehen und müssten zu den größeren Maschinen (Bx) wechseln, um eine Aufgabenwarteschlange besser zu nutzen. Für lokale Tests würden Sie normalerweise BindingProviderProperties.CONNECT_TIMEOUT und BindingProviderProperties.REQUEST_TIMEOUT verwenden, sie befinden sich jedoch nicht in der JRE-White List von App Engine und Ihre Code-Inspektion könnte Sie ständig davor warnen.

com.sun.xml.internal.ws.connect.timeout 
com.sun.xml.internal.ws.connect.timeout 

Für den Einsatz auf App Engine: Die äquivalenten Strings können jedoch verwendet werden

com.sun.xml.ws.connect.timeout 
com.sun.xml.ws.request.timeout 

ein vollständiges Beispiel, wie das automatisch generierte bewerben Code von JAX-WS 2.x, Werte müssen in Millisekunden angegeben werden:

@WebEndpoint(name = "Your.RandomServicePort") 
public YourServiceInterface getYourRandomServicePort() { 
    YourRandomServiceInterface port = super.getPort(YOURRANDOMSERVICE_QNAME_PORT, YourRandomServiceInterface.class); 
    Map<String, Object> requestContext = ((BindingProvider)port).getRequestContext(); 
    requestContext.put("com.sun.xml.ws.connect.timeout", 10000); 
    requestContext.put("com.sun.xml.ws.request.timeout", 10000); 
    return port; 
} 
Verwandte Themen