async http client for java and scripting language
DESCRIPTION
JavaOne 2010 talk.TRANSCRIPT
![Page 1: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/1.jpg)
Wri$ng Powerful HTTP Apps Using the New Asynchronous HTTP Client
Library
Jeanfrancois Arcand h@p://[email protected]/jfarcand
h@p://github.com/AsyncH@pClient/async-‐h@p-‐client
Hubert Iwaniuk h@p://[email protected]/neotyk
![Page 2: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/2.jpg)
Jeanfrancois
Creator of the Grizzly Framework
Creator of GlassFish v3 Grizzly Micro
Kernel Creator and Co-‐
Leader of Atmosphere
9 years @ Sun Microsystem
Creator Async H@p Client
Major contributor to GlassFish
![Page 3: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/3.jpg)
• News and Update • Why
• The Async H@p Client API • Conclusion • Q & A
![Page 4: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/4.jpg)
Since released, we’ve got an impressive amount of
contribu$ons and adop$ons. Library is evolving fast!
![Page 5: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/5.jpg)
Why
JDK’s UrlConnec$on Totally Broken
![Page 6: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/6.jpg)
Why
JDK’s UrlConnec$on Totally Broken
Apache H@pClient high on steroid
![Page 7: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/7.jpg)
Why
JDK’s UrlConnec$on Totally Broken
Apache H@pClient high on steroid
Apache H@p is blocking
![Page 8: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/8.jpg)
Why
JDK’s UrlConnec$on Totally Broken
Apache H@pClient high on steroid
Apache H@p is blocking
Apache H@pClient buffer the bytes in
memory
![Page 9: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/9.jpg)
Why
JDK’s UrlConnec$on Totally Broken
Apache H@pClient high on steroid
Apache H@p is blocking
Apache H@pClient buffer the bytes in
memory
Apache H@pClient is $ed to its own
I/O layer.
![Page 10: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/10.jpg)
Why
AsyncH@pClient supports the “zero-‐copy”
![Page 11: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/11.jpg)
Why
AsyncH@pClient supports the “zero-‐copy”
Large Upload using na$ve memory
Small memory
![Page 12: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/12.jpg)
Why
AsyncH@pClient supports the “zero-‐copy”
AsyncH@pClient is not $ed to it’s
I/O layer
![Page 13: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/13.jpg)
Why
AsyncH@pClient supports the “zero-‐copy”
AsyncH@pClient is not $ed to it’s
I/O layer Ne@y
Grizzly
Apache H@pClient
JDK UrlConnec
$on
![Page 14: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/14.jpg)
Why
AsyncH@pClient supports the “zero-‐copy”
AsyncH@pClient is not $ed to it’s
I/O layer
AsyncH@pClient is blocking or non blocking
![Page 15: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/15.jpg)
Why
AsyncH@pClient supports the “zero-‐copy”
AsyncH@pClient is not $ed to it’s
I/O layer
AsyncH@pClient is blocking or non blocking
Allow efficient streaming
Use the well know
Future<?> API
![Page 16: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/16.jpg)
Why
AsyncH@pClient supports the “zero-‐copy”
AsyncH@pClient is not $ed to it’s
I/O layer
AsyncH@pClient is blocking or non blocking
AsyncH@pClient doesn’t buffer the bytes in memory
![Page 17: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/17.jpg)
Why
AsyncH@pClient supports the “zero-‐copy”
AsyncH@pClient is not $ed to it’s
I/O layer
AsyncH@pClient is blocking or non blocking
AsyncH@pClient doesn’t buffer the bytes in memory
Your applica$on have control
![Page 18: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/18.jpg)
Why
AsyncH@pClient supports the “zero-‐copy”
AsyncH@pClient is not $ed to it’s
I/O layer
AsyncH@pClient is blocking or non blocking
AsyncH@pClient doesn’t buffer the bytes in memory
AsyncH@pClient is easy to use
![Page 19: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/19.jpg)
Fully Asynchronous
request
callback Response chunk
Calling Thread
callback Response chunk
Server Thread Pool (*)
![Page 20: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/20.jpg)
Comple$onHandler
request
Response start
Calling Thread
callback Response end
Server Thread Pool (*)
![Page 21: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/21.jpg)
Future based API AsyncH@pClient asyncH@pClient = new AsyncH@pClient();
Future<Response> f = [email protected]("h@p://www.sonatype.com/").execute();
Response r = f.get();
![Page 22: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/22.jpg)
Handler based API AsyncH@pClient asyncH@pClient = new AsyncH@pClient(); Future<Response> asyncH@pClient. prepareGet("h@p://www.sonatype.com/").execute(
new AsyncComple=onHandler<Response>( { @Override public Response onCompleted(Response r){
return response; }
@Override public void onThrowable(Throwable t){
} });
![Page 23: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/23.jpg)
Typed AsyncH@pClient asyncH@pClient = new AsyncH@pClient(); [email protected]("h@p://www.sonatype.com/").execute( new AsyncComple$onHandler<Integer>( { @Override public Integer onCompleted(Response r){ return response.getStatus(); }
@Override public void onThrowable(Throwable t){
} }).get(); // Return Integer
![Page 24: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/24.jpg)
Request Builder
AsyncH@pClient c= new AsyncH@pClient();
c.preparePost(“h@ps://….”) .setBody(body) .setHeader(header) .setProxy(proxy) .execute();
![Page 25: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/25.jpg)
Streaming Handler AsyncH@pClient c = new AsyncH@pClient(); Future<String> f = c.prepareGet("h@p://www.sonatype.com/").execute(
new AsyncHandler<String>() {
@Override public STATE onStatusReceived(H@pResponseStatus<String> status) throws Excep$on { // return STATE.ABORT to stop }
@Override public STATE onHeadersReceived(H@pResponseHeaders<String> headers) throws Excep$on { …}
@Override public STATE onBodyPartReceived(H@pResponseBodyPart<String> bodyPart) throws Excep$on {…} }.get();
![Page 26: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/26.jpg)
Progress Handler Future<String> f = [email protected](uri) .setRealm(createRealm()) .setProxyServer(createProxyServer()) .setFile(file) .execute(comple$onHandler); ("….").setFile(.execute(
new AsyncComple=onHandler<String>() {
@Override public STATE onHeaderWriteCompleted() { return STATE.CONTINUE; }
@Override public STATE onContentWriteCompleted() { return STATE.CONTINUE; }
@Override public STATE onContentWriteProgess(long amount, long current, long total) { return STATE.CONTINUE; } )
![Page 27: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/27.jpg)
Configurable AsyncH@pClientConfig c = new [email protected](). setResponseTimeoutInMs(30000).build();
AsyncH@pClient asyncH@pClient = new AsyncH@pClient(c);
Realm realm = new Realm.RealmBuilder() .setPrincipal(“me”) .setPassword(“xxxx”).build(); c.setRealm(realm);
AsyncH@pClient asyncH@pClient = new AsyncH@pClient(c);
![Page 28: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/28.jpg)
Zero Copy -‐ Upload
AsyncH@pClient c= new AsyncH@pClient();
c.preparePost(“h@ps://….”) .setBody(body) .setFile(header) .setProxy(proxy).execute();
![Page 29: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/29.jpg)
Zero Copy -‐ Download AsyncH@pClient c = new AsyncH@pClient(); Future<String> f = c.prepareGet("h@p://www.sonatype.com/").execute(
new AsyncHandler<String>() {
@Override public STATE onBodyPartReceived(H@pResponseBodyPart<String> bodyPart) throws Excep$on {
bodyPart.write(OutputStream); } }.get();
![Page 30: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/30.jpg)
TLS Support
// Op$onal AsyncH@pClientConfig c = new [email protected](). setSSLEngine(…).build();
AsyncH@pClient asyncH@pClient = new AsyncH@pClient(c);
Future<String> f = c.prepareGet("hBps://….").get();
![Page 31: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/31.jpg)
Scrip$ng Support -‐ Clojure
• (ns twi@er-‐stream (:require [[email protected] :as c] [org.danlarkin.json :as j] [clojure.contrib.logging :as l]))
(doseq [twit-‐str (c/string (c/stream-‐seq :get "h@p://[email protected]/1/statuses/sample.json" :auth {:user "u" :password "p"} :$meout -‐1))] (try (let [twit (j/decode-‐from-‐str twit-‐str)] (l/info (str (get-‐in twit [:user :screen_name]) "=>" (:text twit)))) (catch Excep$on e (l/warn (str "Failed to parse: " twit-‐str) e))))
![Page 32: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/32.jpg)
Scrip$ng Support -‐ JRuby
client = [email protected] future = client.prepare_get("h@p://…")
.set_header("X-‐Trace", "true").execute
response = future.get
response.headers.each
{ |pair| puts "#{pair.key} =>
#{pair.value.join(", ")}" } client.close
![Page 33: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/33.jpg)
Scrip$ng Support -‐ Jython
client = AsyncH@pClient() future = client.prepareGet("h@p://www.google.com/")
.setHeaders({ "User-‐Agent" : [ "Async HTTP Client/1.0.0" ]})
.execute()
response = future.get() for entry in response.headers: print '%s => %s' % (entry.key, ", ".join(entry.value)) client.close()
![Page 34: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/34.jpg)
What’s Next
• NTLM support • Websocket support
• New Providers: – Grizzly 2.0 – Apache H@pClient
• H@p Pipelining • Annota$on based support.
![Page 35: Async Http Client for Java and Scripting Language](https://reader033.vdocuments.mx/reader033/viewer/2022052523/55615350d8b42a857d8b50c4/html5/thumbnails/35.jpg)
Fancy @BaseURL("h@p://localhost:12345") public interface FooClient { @GET("/") public Future<Response> getRoot();
@GET("/") public Future<String> getRootAsString();
@GET("/") public Future<String> getRootWithParam(@QueryParam("name") String name); } FancyClientBuilder builder = new FancyClientBuilder(asyncClient); FooClient client = builder.build(FooClient.class);