2009-06-18 20 views
18

Come newbie relativa nel mondo Java, sto trovando molte cose frustranti che ottengono risultati relativamente insignificanti in molti altri framework. Un esempio primario è una soluzione semplice per le richieste HTTP asincrone. Visto che uno non sembra esistere già, qual è l'approccio migliore? Creare i miei thread usando un tipo di blocco lib come httpclient o il java http incorporato, o dovrei usare il più recente roba io java non bloccante - sembra particolarmente complesso per qualcosa che dovrebbe essere semplice.Client HTTP asincrono per Java

Quello che sto cercando è qualcosa di facile da usare dal punto di vista dello sviluppatore - qualcosa di simile a URLLoader in AS3 - dove si crea semplicemente un URLRequest - allega un gruppo di gestori di eventi per gestire il completamento, errori, progresso, ecc. e chiama un metodo per attivarlo.

Se non si ha familiarità con URLLoader in AS3, il suo modo super facile e simile a questa:

private void getURL(String url) 
{ 
    URLLoader loader = new URLLoader(); 
    loader.addEventListener(Event.Complete, completeHandler); 
    loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler); 
    loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 

    URLRequest request = new URLRequest(url); 

    // fire it off - this is asynchronous so we handle 
    // completion with event handlers 
    loader.load(request); 
} 

private void completeHandler(Event event) 
{ 
    URLLoader loader = (URLLoader)event.target; 
    Object results = loader.data; 

    // process results 
} 

private void httpStatusHandler(Event event) 
{ 
    // check status code 
} 

private void ioErrorHandler(Event event) 
{ 
    // handle errors 
} 

risposta

5

Sembra che si desidera (una parte di) NIO - c'è un buon tutorial here, il parte di rete asincrona inizia da p. 30 e ci sono molti link utili alla fine.

1

Quindi, probabilmente vale la pena considerare che actionscript e Java non server la stessa nicchia. Ad esempio, Java rende alcune cose più noiose - ma di solito questo è per dare all'utente più opzioni su come, ad esempio, viene eseguita una connessione HTTP, mentre actionscript potrebbe astrarre dettagli o possibili errori per facilitarne l'uso. Ma il tuo punto è ancora valido.

Io stesso non sono a conoscenza di un client HTTP asincrono per Java. La risposta di Alex Martelli parla del NIO di Java, che è una buona risposta se sei interessato ad implementare il protocollo HTTP nel tuo codice. NIO ti consente di utilizzare i socket per connettersi al server web, ma in seguito devi creare manualmente le tue richieste GET e analizzare le intestazioni/i dati HTTP in arrivo.

Un'altra opzione è utilizzare le classi java.net.URL e puoi trovare molti tutorial per quelli online e su StackOverflow. Puoi avvolgere quelli nei thread, quindi il tuo programma java ha più thread di esecuzione.

Ma poi si incontra il problema della sincronizzazione. Il che sono d'accordo, è un dolore, ma offre un livello più granulare di flessibilità.

(mi rendo conto che questo non risponde alla tua domanda! - e se qualcuno in realtà sa di un impianto di Java per fare richieste HTTP asincrone, sarei interessato a sapere)

+0

Capire completamente le diverse nicchie. Tuttavia, in questo caso, stiamo utilizzando Java come framework dell'interfaccia utente client e molti dei dati da presentare provengono da servizi Web esterni. – helifreak

+0

In realtà ci sono più client http asincroni, elencati in altre risposte (il molo ne ha avuto uno per anni, jakarta hc un po 'di tempo fa, il client http async di ning è il più recente e attivamente sviluppato). Non hanno ottenuto abbastanza attenzione che meritano. – StaxMan

1

AFAIK lo strumento prende un TCPMon approccio simile a quello che descrivi. Puoi dare un'occhiata al codice sorgente nel loro SVN browser

Anche dare un'occhiata a WGET-java per l'intestino del codice di blocco.

Ma devi scrivere questo in Java? Ci sono molti altri approcci che usano JRuby o Rhino per realizzare qualcosa di simile facilmente che girerà sulla JVM ma non è scritto in Java.

+0

Bene, l'uso di altri linguaggi che vengono compilati in bytecode java è un'opzione futura, ma abbiamo sicuramente bisogno anche di qualcosa di basato su Java. Grazie per i suggerimenti. – helifreak

1

httpunit e sono 2 client Java http personalizzabili e configurabili in grado di tutto ciò che un browser come simulare firefox, browsing headless, client software programmati e agenti.

+0

Stavo per dirlo, ma nessuno di questi è asincrono. Tuttavia, fanno un lavoro piuttosto veloce nei compiti di automazione. – cwash

0

Suggerirei di attivare thread separati per quello.

+0

anche se ho sparato thread separati, sento ancora i fili bloccati e non veloce come mi aspettavo ... – trillions

6

Se non l'hai già guardato, controlla il java.util Java 5.Concorrente: rende molto più facili da sviluppare le applicazioni multi-thread. Puoi impostare un ThreadPoolExecutor che gestisce, ad esempio, quattro thread. Successivamente, si alimenta il pool con un numero qualsiasi di attività da completare. Ogni attività è un Runnable. ThreadPoolExecutor accoderà le attività eseguibili e le inoltrerà ai thread disponibili in parallelo. Il metodo afterExecute() del pool viene chiamato quando ciascuna attività Runnable viene completata.

Ricordo chiaramente di aver scritto un pool di thread di recupero per un browser Web scritto in Java nel 1999 ed era un orso per avere ragione. Il mese scorso ho scritto un tester di carico per un server web. Il tester ha un ThreadPoolExecutor che ha n thread e le attività eseguibili che lo alimento prelevano una pagina utilizzando il client HTTP Apache. Ci sono voluti solo un'ora o due per farlo funzionare abbastanza bene. Penso che ti piacerà java.util.concurrent accoppiato con Apache HTTP Client, anche se sembra che tu debba fare un po 'di personalizzazione per l'indicazione del progresso.

(Si noti che client HTTP Apache fa il suo pool di thread, e il tu limiti di configurazione di default a 20 thread massimo, e solo due per ogni server Web.)

Aggiornamento: Ecco il link per Apache HTTP Client. Assicurati di leggere su MultiThreadedHttpConnectionManager, è ciò che gestisce il pool di connessioni e non è mostrato nell'esempio più semplice.

+0

Buone informazioni. Grazie. Non riesco ancora a credere a quanto il client sia ostile a Java. Forse Java sta appena iniziando a mostrare la sua età. – helifreak

+0

Non ho praticamente sviluppato nessuno in Java durante 1.4 e Java 5 anni, e ora trovo Java 6 decisamente migliore di 1.3. Oltre a java.util.concurrent, spiccano generici e il framework Collections. La tecnologia su Java può sembrare ostile: confronta JAXP con l'elaborazione XML concisa di Groovy. Anche. linguaggi dinamici come Ruby, Python e Scala sono una competizione seria al giorno d'oggi. –

+2

No, non è che Java stia mostrando l'età; controlla più client http non-JDK in bundle non bloccanti (asincroni). Non c'è bisogno di fare confusione esplicita con i thread solo per fare accessi simultanei. Anche se sarebbe opportuno avere un'alternativa non bloccante in JDK ci sono così tante cose utili che probabilmente è meglio cercare di mantenere JDK ancora più grande. – StaxMan

0

Ho appena imbattuto il client HTTP asincrono implementato all'interno di Geronimo. Si potrebbe anche voler dare un'occhiata, al http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/ - Caveat: l'ultimo commit sembra più vecchio di un anno.

Un altro progetto la costruzione di un client HTTP asincrono è xsocket: xsocket.sourceforge.net

+0

Questo http://cwiki.apache.org/AWEB/ sembra essere la posizione corrente. Non sono sicuro di quanto sia attivo. – Eelco

8

La versione 4.0 di Apache Commons HttpClient (ora in HttpComponents/HttpCore) supporta anche NIO di Java (IO non bloccante). Penso che questa sia la soluzione migliore.

15

Utilizzare il "Client Http async" precedentemente chiamato ning http client library. Vedere http://code.ning.com/2010/03/introducing-nings-asynchronous-http-client-library/

ora disponibile a GitHub https://github.com/ning/async-http-client

+1

Ed è su github all'indirizzo http://github.com/ning/async-http-client. Posso raccomandare questo, dopo averlo usato, anche se per lo più solo come un semplice client http sincrono affidabile. Ma con semplici risultati basati sul futuro, l'operazione asincrona è anche semplice da usare. – StaxMan

+1

Hanno cambiato i repository GitHub, ora sono su http://github.com/AsyncHttpClient/async-http-client – jfager

+1

In realtà hanno cambiato nuovamente i repository di GitHub e ora sono su https://github.com/sonatype/ async-http-client. Ho aggiornato la risposta per riflettere la corretta posizione del repository ora. –

2

ci sono librerie e framework scritto in cima NIO/Netty - RxNetty e Vertx che può essere utile scrivere asincrono client HTTP

Di seguito è riportato un esempio codice utilizzando VertX

public class Client extends AbstractVerticle { 

    @Override 
    public void start() throws Exception { 
    //lambda callback would be called when the response comes back 
    vertx.createHttpClient().getNow(8080, "localhost", "/", resp -> { 
     System.out.println("Got response " + resp.statusCode()); 
     resp.bodyHandler(body -> { 
     System.out.println("Got data " + body.toString("ISO-8859-1")); 
     }); 
    }); 
    //this code statement will execute before response comes back 
    System.out.println("I am not blocked"); 
    } 
} 

è possibile trovare il codice di esempio in piena regola da here