2009-11-16 7 views
1

J'ai du code qui fait un tas de HTTP GET, POST et PUT en utilisant Commons HttpClient 3.1. Je voudrais fournir un indicateur de vitesse de transfert actuel dans mon interface graphique, mais je n'ai pas trouvé de méthodes pour déterminer le taux de transfert d'un HttpMethod en cours de traitement.Comment obtenir le taux de transfert actuel dans Commons HttpClient 3.x

Je pourrais facilement juste chronométrer le transfert et faire quelques calculs simples après qu'il était complet pour déterminer quelle était la vitesse, mais cela fournit une mauvaise expérience utilisateur pendant un téléchargement ou un téléchargement long. Est-ce que quelqu'un sait comment déterminer le taux de transfert d'une requête Commons HttpClient tandis que est toujours en cours de traitement?

Répondre

3

Je n'ai pas beaucoup utilisé HttpClient, donc il peut y avoir un simple hook. Cependant, il semble que HttpConnection.getResponseInputStream() renvoie un InputStream simple.

Pour ajouter le crochet vous-même, vous devez remplacer et HttpConnection, pour renvoyer un flux décoré qui conserve la trace du nombre d'octets lus. Vous pouvez ensuite générer un deuxième thread pour interroger ce flux et afficher le taux de transfert, ou (mieux) créer le flux avec un rappel tous les N octets (mieux parce que vous n'avez pas à vous soucier de la concurrence, et vous pouvez également définir N de telle sorte que le rappel n'est invoqué que pour les fichiers volumineux).

+0

On dirait que je peux probablement combiner ce conseil avec le code de ht tp: //docstore.mik.ua/orelly/java-ent/dist/ch08_04.htm et que quelque chose fonctionne, je vais essayer et faire un rapport. –

+0

Fonctionne. Il n'y a pas de meilleur moyen que je puisse trouver, malheureusement. Assez bien! –

1

crochet serait plus simple d'étendre le HttpEntityWrapper et remplacer la méthode getContent():

public InputStream getContent() throws IOException { 
    InputStream wrappedin = wrappedEntity.getContent(); 
    return new MyTransferRateInputStream(wrappedin); 
} 

Plus tard, vous pouvez ajouter ce que la réponse intercepteur

httpClient.addResponseInterceptor(HttpResponseInterceptor itcp) 

De cette façon, vous n'avez pas besoin de passer outre les et HttpConnection

Questions connexes