Timeout ist nicht gleich Timeout

Letzte Woche mussten ich einen Webservice-Client erweitern, sodass er die Verarbeitung abbricht, wenn die Gegenseite nicht schnell genug ein Ergebnis liefert. Das Ganze ist mit spring-webservices implementiert und verwendet die WebServiceTemplate Klasse. Ein Blick in die Dokumentation sollte hier weiterhelfen. Einen direkten Hinweis darauf, wie ein Timeout konfiguriert wird, habe ich nicht gefunden. Allerdings beschreibt die Dokumentation unter “6.2.1.1. URIs and Transports” die beiden Klassen HttpUrlConnectionMessageSender und CommonsHttpMessageSender, die für den Datentransport mittels HTTP zuständig sind. In meinem Fall wird CommonsHttpMessageSender eingesetzt. (Wenn nicht anders konfiguriert, verwendet spring-webservices HttpUrlConnectionMessageSender.)
Die Klasse CommonsHttpMessageSender hat die Eigenschaft „readTimeout“. Ich habe sie in der Konfiguration auf den gewünschten Wert gesetzt und das Ganze getestet. Die ersten Tests liefen ohne Probleme – der Client brach mit einer Exception ab, wenn die Verarbeitung zulange gedauert hat. War doch eigentlich ganz einfach… wenn da nicht ein Problem aufgetaucht wäre. Bei einem der weiteren Tests habe ich vergessen, den Server zu starten, auf dem der Webservice lief. Und was passiert? Der soeben konfigurierte Timeout zeigt keine Wirkung.
Ich kürze an dieser Stelle ab und komme gleich zum Punkt. Der HTTP-Client unterscheidet zwischen zwei unterschiedlichen Timeouts. Es handelt sich um http.connection.timeout und http.socket.timeout. Der erste Timeout beschreibt, wie lange der Client wartet, bis eine Verbindung mit der Gegenseite aufgebaut wird. Der zweite Timeout beschreibt, wie lange der Client auf das Ergebnis der Gegenseite wartet. Der
zweite Timeout (http.socket.timeout) zeigt also nur Wirkung, wenn bereits eine Verbindung mit der Gegenseite aufgebaut werden konnte. Wenn man nicht will, dass der Client den aktuellen Thread blockiert, sollte man beide Timeouts konfigurieren.

Die resultierende Konfiguration könnte also wie folgt aussehen:

<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory" />
 
<bean id="httpSender" class="org.springframework.ws.transport.http.CommonsHttpMessageSender">
<property name="connectionTimeout" value="3000" />
<property name="readTimeout" value="5000" />
</bean>
 
<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<constructor-arg ref="messageFactory" />
<property name="messageSender" ref="httpSender" />
</bean>
  • Facebook
  • Delicious
  • Digg
  • StumbleUpon
  • Reddit
  • Blogger
  • LinkedIn
Eugen Melnichuk

4 Antworten auf Timeout ist nicht gleich Timeout

  1. Michael sagt:

    Laut JavaDoc setzt man den Timeout in Millisekunden. Mit den gesetzten Timeouts (3 und 5 Miilisekunden) dürfte höchstens bei localhost-Zugriffen eine Verbindung möglich sein. Über ein Netzwerk aber bestimmt nicht.

  2. Vito Meuli sagt:

    Thanks a lot!
    Other posts about the same matter do not underline such important differences.
    Cheers,
    Vito

  3. Very helpful, especially the distinction between the two types of timeout. Thank you!

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>