• Like
  • Save
Async Http Client for Java and Scripting Language
Upcoming SlideShare
Loading in...5
×
 

Async Http Client for Java and Scripting Language

on

  • 4,495 views

JavaOne 2010 talk.

JavaOne 2010 talk.

Statistics

Views

Total Views
4,495
Views on SlideShare
4,477
Embed Views
18

Actions

Likes
4
Downloads
33
Comments
0

2 Embeds 18

http://blog.newitfarmer.com 16
http://www.slashdocs.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Async Http Client for Java and Scripting Language Async Http Client for Java and Scripting Language Presentation Transcript

    • Wri$ng  Powerful  HTTP  Apps  Using   the  New  Asynchronous  HTTP  Client   Library   h@p://github.com/AsyncH@pClient/async-­‐h@p-­‐client   Jeanfrancois  Arcand   Hubert  Iwaniuk   h@p://twi@er.com/jfarcand   h@p://twi@er.com/neotyk  
    • Creator  of     Creator  of   the  Grizzly   GlassFish  v3   Creator  and  Co-­‐ Framework     Grizzly  Micro   Leader  of     Kernel   Atmosphere   Jeanfrancois   9  years  @  Sun   Creator  Async   Microsystem   H@p  Client   Major   contributor  to   GlassFish  
    • •  News  and  Update   •  Why     •  The  Async  H@p  Client  API   •  Conclusion     •  Q  &  A  
    • Since  released,  we’ve  got  an   impressive  amount  of   contribu$ons  and  adop$ons.   Library  is  evolving  fast!  
    • JDK’s   UrlConnec$on   Totally  Broken   Why  
    • JDK’s   Apache   UrlConnec$on   H@pClient  high   Totally  Broken   on  steroid   Why  
    • JDK’s   Apache   UrlConnec$on   H@pClient  high   Totally  Broken   on  steroid   Why   Apache  H@p  is   blocking  
    • JDK’s   Apache   UrlConnec$on   H@pClient  high   Totally  Broken   on  steroid   Why   Apache  H@p  is   blocking   Apache  H@pClient   buffer  the  bytes  in   memory  
    • JDK’s   Apache   UrlConnec$on   H@pClient  high   Totally  Broken   on  steroid   Why   Apache  H@p  is   Apache  H@pClient   blocking   is  $ed  to  its  own     I/O  layer.   Apache  H@pClient   buffer  the  bytes  in   memory  
    • AsyncH@pClient   supports  the   “zero-­‐copy”     Why  
    • AsyncH@pClient   Large  Upload   supports  the   using  na$ve   memory   “zero-­‐copy”     Small   memory     Why  
    • AsyncH@pClient   AsyncH@pClient   supports  the   is  not  $ed  to  it’s   “zero-­‐copy”     I/O  layer     Why  
    • AsyncH@pClient   AsyncH@pClient   supports  the   is  not  $ed  to  it’s   “zero-­‐copy”     I/O  layer     Ne@y     JDK   UrlConnec $on   Why   Apache   H@pClient   Grizzly  
    • AsyncH@pClient   AsyncH@pClient   supports  the   is  not  $ed  to  it’s   “zero-­‐copy”     I/O  layer     Why   AsyncH@pClient   is  blocking  or   non  blocking  
    • AsyncH@pClient   AsyncH@pClient   supports  the   is  not  $ed  to  it’s   “zero-­‐copy”     I/O  layer     Why   AsyncH@pClient   is  blocking  or   non  blocking   Use  the  well   Allow  efficient   know     streaming   Future<?>  API  
    • AsyncH@pClient   AsyncH@pClient   supports  the   is  not  $ed  to  it’s   “zero-­‐copy”     I/O  layer     Why   AsyncH@pClient   is  blocking  or   non  blocking   AsyncH@pClient   doesn’t  buffer  the   bytes  in  memory  
    • AsyncH@pClient   AsyncH@pClient   supports  the   is  not  $ed  to  it’s   “zero-­‐copy”     I/O  layer     Why   AsyncH@pClient   is  blocking  or   non  blocking   Your  applica$on   have  control   AsyncH@pClient   doesn’t  buffer  the   bytes  in  memory  
    • AsyncH@pClient   AsyncH@pClient   supports  the   is  not  $ed  to  it’s   “zero-­‐copy”     I/O  layer     Why   AsyncH@pClient   is  blocking  or   AsyncH@pClient  is   non  blocking   easy  to  use   AsyncH@pClient   doesn’t  buffer  the   bytes  in  memory  
    • Fully  Asynchronous   Calling  Thread   Server  Thread  Pool  (*)   request   Response  chunk   callback   Response  chunk   callback  
    • Comple$onHandler   Calling  Thread   Server  Thread  Pool  (*)   request   Response  start   Response  end   callback  
    • Future  based  API   AsyncH@pClient  asyncH@pClient  =  new  AsyncH@pClient();    Future<Response>  f  =            asyncH@pClient.prepareGet("h@p://www.sonatype.com/").execute();   Response  r  =  f.get();    
    • 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){                  }       });  
    • Typed   AsyncH@pClient  asyncH@pClient  =  new  AsyncH@pClient();   asyncH@pClient.prepareGet("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  
    • Request  Builder   AsyncH@pClient  c=  new  AsyncH@pClient();   c.preparePost(“h@ps://….”)                                  .setBody(body)          .setHeader(header)                                  .setProxy(proxy)                                  .execute();  
    • 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();  
    • Progress  Handler   Future<String>  f  =    h@pClient.preparePut(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;                  }   )  
    • Configurable   AsyncH@pClientConfig  c  =       new  AsyncH@pClientConfig.Builder().       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);  
    • Zero  Copy  -­‐  Upload   AsyncH@pClient  c=  new  AsyncH@pClient();   c.preparePost(“h@ps://….”)                                  .setBody(body)            .setFile(header)                                  .setProxy(proxy).execute();  
    • 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();  
    • TLS  Support   //  Op$onal   AsyncH@pClientConfig  c  =       new  AsyncH@pClientConfig.Builder().       setSSLEngine(…).build();   AsyncH@pClient  asyncH@pClient  =       new  AsyncH@pClient(c);   Future<String>  f  =        c.prepareGet("hBps://….").get();  
    • Scrip$ng  Support  -­‐  Clojure   •  (ns  twi@er-­‐stream      (:require  [h@p.async.client  :as  c]                          [org.danlarkin.json  :as  j]                          [clojure.contrib.logging  :as  l]))   (doseq  [twit-­‐str  (c/string                                      (c/stream-­‐seq  :get  "h@p://stream.twi@er.com/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))))  
    • Scrip$ng  Support  -­‐  JRuby   client  =  AsyncH@pClient.new     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    
    • 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()    
    • What’s  Next   •  NTLM  support   •  Websocket  support   •  New  Providers:   – Grizzly  2.0   – Apache  H@pClient   •  H@p  Pipelining   •  Annota$on  based  support.  
    • 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);