2011-10-20 6 views
7

Il mio requisito è molto semplice da comprendere.Come limitare le chiamate a servizi Web in un'applicazione Web Java

Desidero chiamare un servizio Web dalla mia applicazione Web Java con una limitazione di massimo 10 chiamate al minuto al servizio web. Subito dopo 1 minuto, posso stabilire un'altra connessione 10, indipendentemente dallo stato delle precedenti 10 chiamate al servizio web (completate o non completate).

Qualcuno può guidarmi l'approccio per implementarlo? Qualche tutorial o link utili?

risposta

5

Utilizziamo RequestThrottler (gist) ovvero inspired by this blog post.

Usage:

private static final int MAX_CALLS = 10; 
private static final int PER_INTERVAL = 60000; // 60s 
private static final int MAX_WAIT = 2000; // 2s 

private RequestThrottler _throttler = new RequestThrottler(MAX_CALLS, PER_INTERVAL); 
private SomeWebService _service = new SomeWebService(); 

public void callService() { 
    throttler.startRequest(MAX_WAIT); 
    _service.call(); 
} 

Non che si potrebbe avere a prendersi cura di possibili congestioni, soprattutto se si ha intenzione di aspettare a tempo indeterminato come parte di richieste web.

+0

Questo sembra buono. Devo rendere la classe singleton, in quanto più utenti possono colpire allo stesso tempo. Oppure posso inserire questo codice che hai postato in una semplice classe java e usarlo nel mio servlet? – Badal

+0

@Badal puoi avere tutte le istanze che vuoi, ad es. per diversi servizi web. Pertanto, non vorrei renderlo un singleton. È assolutamente necessario condividere l'istanza tra tutte le chiamate a un servizio protetto. Tuttavia, come farlo dipende dalla tua applicazione. Ad esempio, se stai usando Spring, dovresti rendere RequestThrottler un campo di un bean anche di un bean stesso. In alternativa, è possibile memorizzarlo nell'ambito dell'applicazione dell'applicazione Web o eseguire la limitazione all'interno di un filtro. Vedete, molte opzioni qui. – sfussenegger

+0

@ sfussenegger: Per essere chiaro, lascia che ti spieghi. Diciamo che 500 utenti hanno colpito il mio server, quindi avrò 500 istanze servlet. Ciascuno creerà l'oggetto SomeWebService e l'oggetto throttler (quindi avrò 500 oggetti di servizio e 500 oggetti throttler). Ora la classe RequestThrottler si prenderà cura di Maximum hit al minuto. Per favore, la mia comprensione è giusta? e comunque, grazie mille per il tuo aiuto. :) – Badal

2

Dai un'occhiata allo Apache Camel e alla sua implementazione del throttler http://camel.apache.org/throttler.html.

+0

Avete qualche esempio di codice rapido per questa implementazione del throttler Camel? – Badal

+0

purtroppo no – wesoly

+0

http://grepcode.com/file/repo1.maven.org/maven2/org.apache.camel/camel-core/2.9.2/org/apache/camel/impl/ThrottlingInflightRoutePolicy.java#ThrottlingInflightRoutePolicy. throttle% 28org.apache.camel.impl.Route% 2Corg.apache.camel.impl.Exchange% 29? – mestachs