16

Mam program, który używa javax.xml.ws.Service do wywoływania usługi zdalnej zdefiniowanej przez WSDL. Ten program działa w Google App Engine, który domyślnie ustawia limit czasu połączenia HTTP na 5 sekund {1}. Muszę zwiększyć tę wartość limitu czasu, ponieważ ta usługa często wymaga czasu, aby odpowiedzieć, ale ponieważ żądanie to nie jest wykonywane z URLConnection, nie mogę wymyślić, jak zadzwonić pod numer URLConnection.setReadTimeout(int) {2}, lub w inny sposób zmienić limit czasu.Czy mogę globalnie ustawić limit czasu połączeń HTTP?

Czy istnieje sposób globalnego ustawienia limitu czasu połączenia HTTP w App Engine? I, w celu dzielenia się wiedzą, jak ogólnie rzecz biorąc rozwiązałoby się ten problem?

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

Odpowiedz

4

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

można zrobić coś takiego dostać URLConnection:

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

Całe zagadnienie jest takie, że obiekt 'URLConnection' nigdy nie jest dla mnie dostępny. Żądanie jest wykonane w nieprzejrzysty sposób, który używa 'javax.xml.ws.Service' –

8

Spróbuj tego:

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

Nie próbowałem tego jeszcze, ale otrzymujesz nagrodę za udzielenie odpowiedzi, której jeszcze nie widziałem. –

12

Można spróbować ustawić właściwości systemu sun.net.client.defaultConnectTimeout i sun.net.client.defaultReadTimeout udokumentowane here, np.

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

EDIT

Niestety, tylko ponownie przeczytać i zauważyłem to na Google App Engine. Nie wiem na pewno, ale biorąc pod uwagę sporne powiązania między Google i Oracle, domyślam się, że GAE nie uruchamia Oracle JVM. Zostawię to tutaj na wypadek, gdyby ktoś inny wpadł na podobny problem.

+0

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

1

Dla App Engine z JAX-WS musisz ustawić kontekst żądania (przetestowany dzisiaj z SDK 1.9.15). W przypadku zwykłych maszyn nie można przekroczyć 60. i trzeba przejść na większe maszyny (Bx), aby lepiej wykorzystać kolejkę zadań.

Do testowania lokalnego normalnie można użyć BindingProviderProperties.CONNECT_TIMEOUT i BindingProviderProperties.REQUEST_TIMEOUT, ale nie są one na JRE Białej listy App Engine a inspekcja kod może stale ostrzec cię o tym. Odpowiedniki łańcuchy mogą być stosowane jednak:

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

Dla wdrożenia do App Engine:

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

pełną przykład, jak zastosować to do auto-wygenerowany kod z JAX-WS 2.x, wartości należy podać w milisekundach:

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