16

Ho un programma che utilizza javax.xml.ws.Service per chiamare un servizio remoto definito da un WSDL. Questo programma viene eseguito su Google App Engine che, per impostazione predefinita, imposta il timeout della connessione HTTP su 5 secondi {1}. Ho bisogno di aumentare questo valore di timeout poiché questo servizio richiede spesso molto tempo per rispondere, ma poiché questa richiesta non viene effettuata con URLConnection, non riesco a capire come chiamare URLConnection.setReadTimeout(int) {2}, o altrimenti modificare il timeout.Posso impostare globalmente il timeout delle connessioni HTTP?

Esiste un modo per impostare globalmente il timeout della connessione HTTP su App Engine? E, ai fini della condivisione delle conoscenze, come si dovrebbe risolvere questo genere di problemi in generale?

{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)

risposta

4

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

si può fare qualcosa di simile per ottenere un URLConnection:

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

L'intero problema è che un oggetto 'URLConnection' non è mai disponibile per me. La richiesta è fatta in un modo opaco che usa 'javax.xml.ws.Service' –

8

Prova questo:

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

Non ho ancora provato questo, ma ottieni il bounty per fornire una risposta che non ho ancora visto da nessun'altra parte. –

12

Si potrebbe provare a impostare le proprietà di sistema sun.net.client.defaultConnectTimeout e sun.net.client.defaultReadTimeout documentate here, ad es.

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

EDIT

Siamo spiacenti, appena riletto e ho notato questo è su Google App Engine. Non lo so per certo, ma vista la litigiosa relazione tra Google e Oracle ultimamente, suppongo che GAE non esegua Oracle JVM. Lascerò questo qui nel caso in cui qualcun altro si imbattesse in un problema simile.

+0

Collegamento alla documentazione: http://docs.oracle.com/javase/6/docs/technotes/guides/net/properties.html –

1

Per App Engine con JAX-WS è necessario impostare il contesto della richiesta (testato oggi con SDK 1.9.15). Per le macchine normali non è possibile andare più in alto degli anni '60 e sarebbe necessario passare alle macchine più grandi (Bx) per utilizzare meglio una coda di attività.

Per i test locali si utilizzano normalmente BindingProviderProperties.CONNECT_TIMEOUT e BindingProviderProperties.REQUEST_TIMEOUT, ma non si trovano nell'elenco JRE White App Engine e l'ispezione del codice potrebbe costantemente avvisare l'utente. Le stringhe equivalenti possono essere utilizzati se:

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

Per la distribuzione di App Engine:

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

Un esempio completo come applicare che al codice generato automaticamente da JAX-WS 2.x, i valori devono essere forniti in millisecondi:

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