Wri$ng	
  Powerful	
  HTTP	
  Apps	
  Using	
  
      the	
  New	
  Asynchronous	
  HTTP	
  Client	
  
                   ...
Creator	
  of	
  	
                   Creator	
  of	
  
                                        the	
  Grizzly	
          ...
•  News	
  and	
  Update	
  
•  Why	
  	
  
•  The	
  Async	
  H@p	
  Client	
  API	
  
•  Conclusion	
  	
  
•  Q	
  &	
 ...
Since	
  released,	
  we’ve	
  got	
  an	
  
    impressive	
  amount	
  of	
  
contribu$ons	
  and	
  adop$ons.	
  
   Li...
JDK’s	
  
UrlConnec$on	
  
Totally	
  Broken	
  



                        Why	
  
JDK’s	
                          Apache	
  
UrlConnec$on	
                    H@pClient	
  high	
  
Totally	
  Broken	
   ...
JDK’s	
                           Apache	
  
 UrlConnec$on	
                     H@pClient	
  high	
  
 Totally	
  Broken	...
JDK’s	
                                              Apache	
  
 UrlConnec$on	
                                        H@p...
JDK’s	
                                                 Apache	
  
 UrlConnec$on	
                                        ...
AsyncH@pClient	
  
 supports	
  the	
  
  “zero-­‐copy”	
  	
  



                          Why	
  
AsyncH@pClient	
            Large	
  Upload	
  
    supports	
  the	
           using	
  na$ve	
  
                       ...
AsyncH@pClient	
               AsyncH@pClient	
  
 supports	
  the	
             is	
  not	
  $ed	
  to	
  it’s	
  
  “zer...
AsyncH@pClient	
                         AsyncH@pClient	
  
 supports	
  the	
                       is	
  not	
  $ed	
  t...
AsyncH@pClient	
                AsyncH@pClient	
  
  supports	
  the	
              is	
  not	
  $ed	
  to	
  it’s	
  
   ...
AsyncH@pClient	
                                     AsyncH@pClient	
  
  supports	
  the	
                               ...
AsyncH@pClient	
                                   AsyncH@pClient	
  
  supports	
  the	
                                 ...
AsyncH@pClient	
                                   AsyncH@pClient	
  
  supports	
  the	
                                 ...
AsyncH@pClient	
                                   AsyncH@pClient	
  
  supports	
  the	
                                 ...
Fully	
  Asynchronous	
  
 Calling	
  Thread	
                    Server	
  Thread	
  Pool	
  (*)	
  


                  ...
Comple$onHandler	
  
 Calling	
  Thread	
                    Server	
  Thread	
  Pool	
  (*)	
  


                       ...
Future	
  based	
  API	
  
AsyncH@pClient	
  asyncH@pClient	
  =	
  new	
  AsyncH@pClient();	
  

	
  Future<Response>	
  ...
Handler	
  based	
  API	
  
AsyncH@pClient	
  asyncH@pClient	
  =	
  new	
  AsyncH@pClient();	
  
Future<Response>	
  asyn...
Typed	
  
AsyncH@pClient	
  asyncH@pClient	
  =	
  new	
  AsyncH@pClient();	
  
asyncH@pClient.prepareGet("h@p://www.sonat...
Request	
  Builder	
  

AsyncH@pClient	
  c=	
  new	
  AsyncH@pClient();	
  

c.preparePost(“h@ps://….”)	
  
	
  	
  	
  	...
Streaming	
  Handler	
  
AsyncH@pClient	
  c	
  =	
  new	
  AsyncH@pClient();	
  	
  
Future<String>	
  f	
  =	
  c.prepar...
Progress	
  Handler	
  
Future<String>	
  f	
  =	
  	
  h@pClient.preparePut(uri)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  ...
Configurable	
  
AsyncH@pClientConfig	
  c	
  =	
  	
  
	
   new	
  AsyncH@pClientConfig.Builder().	
  
	
   	
   setResponse...
Zero	
  Copy	
  -­‐	
  Upload	
  

AsyncH@pClient	
  c=	
  new	
  AsyncH@pClient();	
  

c.preparePost(“h@ps://….”)	
  
	
...
Zero	
  Copy	
  -­‐	
  Download	
  
AsyncH@pClient	
  c	
  =	
  new	
  AsyncH@pClient();	
  	
  
Future<String>	
  f	
  =	...
TLS	
  Support	
  
//	
  Op$onal	
  
AsyncH@pClientConfig	
  c	
  =	
  	
  
	
   new	
  AsyncH@pClientConfig.Builder().	
  
...
Scrip$ng	
  Support	
  -­‐	
  Clojure	
  
•  (ns	
  twi@er-­‐stream	
  
   	
  	
  (:require	
  [h@p.async.client	
  :as	
...
Scrip$ng	
  Support	
  -­‐	
  JRuby	
  
client	
  =	
  AsyncH@pClient.new	
  	
  
future	
  =	
  client.prepare_get("h@p:/...
Scrip$ng	
  Support	
  -­‐	
  Jython	
  
	
  	
  	
  	
  client	
  =	
  AsyncH@pClient()	
  future	
  =	
  
              ...
What’s	
  Next	
  
•  NTLM	
  support	
  
•  Websocket	
  support	
  
•  New	
  Providers:	
  
   – Grizzly	
  2.0	
  
   ...
Fancy	
  
@BaseURL("h@p://localhost:12345")	
  	
  
public	
  interface	
  FooClient	
  	
  
{	
  	
  
	
        @GET("/")...
Upcoming SlideShare
Loading in …5
×

Async Http Client for Java and Scripting Language

4,725 views
4,427 views

Published on

JavaOne 2010 talk.

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,725
On SlideShare
0
From Embeds
0
Number of Embeds
45
Actions
Shares
0
Downloads
37
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Async Http Client for Java and Scripting Language

  1. 1. 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  
  2. 2. 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  
  3. 3. •  News  and  Update   •  Why     •  The  Async  H@p  Client  API   •  Conclusion     •  Q  &  A  
  4. 4. Since  released,  we’ve  got  an   impressive  amount  of   contribu$ons  and  adop$ons.   Library  is  evolving  fast!  
  5. 5. JDK’s   UrlConnec$on   Totally  Broken   Why  
  6. 6. JDK’s   Apache   UrlConnec$on   H@pClient  high   Totally  Broken   on  steroid   Why  
  7. 7. JDK’s   Apache   UrlConnec$on   H@pClient  high   Totally  Broken   on  steroid   Why   Apache  H@p  is   blocking  
  8. 8. 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  
  9. 9. 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  
  10. 10. AsyncH@pClient   supports  the   “zero-­‐copy”     Why  
  11. 11. AsyncH@pClient   Large  Upload   supports  the   using  na$ve   memory   “zero-­‐copy”     Small   memory     Why  
  12. 12. AsyncH@pClient   AsyncH@pClient   supports  the   is  not  $ed  to  it’s   “zero-­‐copy”     I/O  layer     Why  
  13. 13. 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  
  14. 14. 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  
  15. 15. 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  
  16. 16. 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  
  17. 17. 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  
  18. 18. 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  
  19. 19. Fully  Asynchronous   Calling  Thread   Server  Thread  Pool  (*)   request   Response  chunk   callback   Response  chunk   callback  
  20. 20. Comple$onHandler   Calling  Thread   Server  Thread  Pool  (*)   request   Response  start   Response  end   callback  
  21. 21. 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();    
  22. 22. 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){                  }       });  
  23. 23. 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  
  24. 24. Request  Builder   AsyncH@pClient  c=  new  AsyncH@pClient();   c.preparePost(“h@ps://….”)                                  .setBody(body)          .setHeader(header)                                  .setProxy(proxy)                                  .execute();  
  25. 25. 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();  
  26. 26. 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;                  }   )  
  27. 27. 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);  
  28. 28. Zero  Copy  -­‐  Upload   AsyncH@pClient  c=  new  AsyncH@pClient();   c.preparePost(“h@ps://….”)                                  .setBody(body)            .setFile(header)                                  .setProxy(proxy).execute();  
  29. 29. 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();  
  30. 30. 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();  
  31. 31. 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))))  
  32. 32. 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    
  33. 33. 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()    
  34. 34. What’s  Next   •  NTLM  support   •  Websocket  support   •  New  Providers:   – Grizzly  2.0   – Apache  H@pClient   •  H@p  Pipelining   •  Annota$on  based  support.  
  35. 35. 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);    

×