2010-02-07 8 views
3

J'ai publié un point de terminaison de service Web sur un serveur http Sun Lightweight. Le serveur fonctionne avec les exécuteurs ThreadPool pour la connexion (Executors.newCachedThreadPool()). J'utilise également le client de service Web régulier (également JAX-WS).Problème de délai d'attente JAX-WS

Il semble que pour chaque appel qui dépasse 5 minutes, le serveur (ou le client) termine le thread d'appel en cours et en ouvre un nouveau. Dans le serveur, il semble qu'une nouvelle connexion ait été établie et essaye d'exécuter la même action. Cela ne se produit qu'une seule fois, ce qui signifie que le "second appel" peut dépasser 5 minutes.

Y at-il un délai d'expiration par défaut pour une connexion? Y a-t-il un moyen de le configurer?

Répondre

0

En fait, j'ai été en mesure de trouver un hack en utilisant les informations fournies par Pascal (merci!). Vous pouvez remplacer l'heure d'inactivité du serveur http en définissant une propriété système -sun.net.httpserver.idleInterval.

1

Je m'attendrais normalement à ce que ce soit un problème côté client (cependant - vérifiez la réponse de Pascal). Les clients auront une valeur de délai d'attente définie et renonceront à une opération prenant trop de temps.

par exemple. Dans HttpClient, vous pouvez définir le délai de connexion et les délais d'attente de lecture séparément (voir the configuration guide).

Si la méthode prend vraiment 5 minutes ou plus, je regarderais comment décomposer cette opération en opérations plus discrètes, chacune prenant une période plus courte. Ou faites le traitement en arrière-plan et donnez au client un ticket de sorte qu'il puisse recevoir ses résultats plus tard sans maintenir de connexion.

Alternativement, vous pouvez être en mesure de définir un délai infini, mais je ne recommanderais pas, puisque votre client devrait idéalement être en mesure d'identifier si votre serveur ne répond pas en raison de problèmes/etc misconfiguration

+0

Vous pouvez également définir des propriétés de délai d'attente pour le client de service Web que j'utilise: Mappage requestContext = bp.getRequestContext(); \t \t \t \t requestContext.put (JAXWSProperties.CONNECT_TIMEOUT, ); requestContext.put (JAXWSProperties.REQUEST_TIMEOUT, ); Cependant, cela n'a pas aidé. – Tal

+0

@Brian Ce n'est en fait pas un problème côté client. –

+0

@Pascal - noté (je n'ai pas encore consulté vos liens). Savez-vous si Jetty ne renonce pas aux connexions inactives d'une manière similaire? Notez que j'ai édité ma réponse de manière appropriée (!) Mais je pense que pour une opération de 5 minutes, le problème du délai d'attente du client entrera en jeu à un moment donné, donc je ne l'ai pas supprimé. –

5

Avec le serveur http léger, une connexion deviendrait inactive après 5 mn. L'implémentation (jetez un oeil à ServerImpl et ServerConfig) ferme les connexions inactives et il n'y a actuellement aucune propriété publique pour définir ce délai d'inactivité. Si vous souhaitez ce type de contrôle, vous pouvez utiliser un conteneur de servlet. Ou vous pouvez utiliser Jetty (which provides a SPI) instead of Sun default HttpServer.