[CON7983] JAX-RS 2.1 for Java EE 8 - RainFocus · PDF file– REST Client API ... –...
Transcript of [CON7983] JAX-RS 2.1 for Java EE 8 - RainFocus · PDF file– REST Client API ... –...
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
[CON7983]JAX-RS2.1forJavaEE8
EdBurnsPavelBucekOracleSeptember,2016
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
SafeHarborStatementTheprecedingisintendedtooutlineourgeneralproductdirecUon.ItisintendedforinformaUonpurposesonly,andmaynotbeincorporatedintoanycontract.Itisnotacommitmenttodeliveranymaterial,code,orfuncUonality,andshouldnotberelieduponinmakingpurchasingdecisions.Thedevelopment,release,andUmingofanyfeaturesorfuncUonalitydescribedforOracle’sproductsremainsatthesolediscreUonofOracle.
4
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
• EdBurns
– ServletandJSFco-speclead– FrequentinternaUonalconferencespeaker– AuthoroffourEnterpriseJavarelatedbooksfromMcGraw-Hill
• PavelBucek
– JavaAPIforWebSocketspeclead– LongUmeJerseydeveloperandimplementaUonlead– RESTexpert– [email protected]
5
SpeakerBios
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ProgramAgenda
JAX-RSinJavaEE8
ReacUveAPI,NIOImprovements
Serversentevents
JavaEEintegraUon,Circuitbreakers,HTTP/2
Roadmap,Q&A
1
2
3
4
5
ConfidenUal–OracleInternal/Restricted/HighlyRestricted 6 E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
JAX-RSinJavaEE8
• ExisUngproposalofscoperemainsunchanged– WewillfoldinandmakeadjustmentstobeheralignJAX-RSwithJavaEE8focusonmicroservices,containers,andotherkeyaspectsoftheJavaEE8update.– JerseywillconUnuetobethereferenceimplementaUon– GlassFishwillconUnuetobethereleasevehicle
7 E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
WhyJAX-RSisimportant
• IfyouaredoingRESTinJava,youarelikelydoingJAX-RS– MostpopularalternaUveisSpringRestController
• SeveralpopularframeworksdependonorleverageJersey– Dropwizard– SpringBoot
• MulUpleimplementaUons– Jersey(ReferenceImplementaUon)– RESTEasy– ApacheCXF
8 E
– ApacheCamel– EhcacheServer
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
BriefAside
• JavaonARM64ServersandScalingwith‘ManyCore’Processors[CON8256]Tuesday,Sep20,4:00p.m.-5:00p.m.|Hilton-GoldenGate6/7/8
9
Cavium
E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
JAX-RShistory
• JAX-RS1.1– JSR311,JavaEE6,2009– JavaAPIforRESTservices,POJObased,HTTPcentric,Containerindependent,…
• JAX-RS2.0– JSR339,JavaEE7,2014– RESTClientAPI,Filtersandinterceptors,Asyncprocessing,BeanvalidaUon,JSON-P,…
• JAX-RS2.1– JSR-370,JavaEE8,2017– Non-blockingIO,ReacUveclients,ServerSentEvents
10 E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
InnovaUonandStandardizaUon
11
JerseyandothersourcesinfluenceJAX-RSSpecifica@on
Jersey1.x
…
JAX-RS1.xClientAPI
Filters
…JAX-RS2.0
SSE
ReacUve
Jersey2.xJAX-RS2.1
Jersey3.x
?
E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
InnovaUonandStandardizaUonJerseyandothersourcesinfluenceJAX-RSSpecifica@on
12 E
Jersey JAX-RS 1.0• client• filters• ...
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
InnovaUonandStandardizaUonJerseyandothersourcesinfluenceJAX-RSSpecifica@on
13 E
Jersey JAX-RS 2.0• reactive• SSE• ...
• client• filters
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
InnovaUonandStandardizaUonJerseyandothersourcesinfluenceJAX-RSSpecifica@on
14 E
Jersey JAX-RS 2.1• client• filters• reactive• SSE
• ...
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ReacUveClientAPI-Future<T>
15
JAX-RS2.0
E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ReacUveAPI
16
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ReacUveClientAPI-InvocaUonCallback<T>
17
JAX-RS2.0
E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ReacUveClientAPI-CompletableFuture<T>
• Java8improvedFuture<T>• CompletableFuture<T>isanimplementaUonofCompleUonStage<T>• Lotsandlotsoffeatures(~38methods)– ComposiUon,callbacks,…– thenApply,thenAccept,thenRun,thenCombine,...
• IdealforsequenUalreacUveinvocaUon• Getresponsesfroms1ands2,combineresults,calls3andprintoutresponse
18
JAX-RS2.1
E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ReacUveClientAPI-CompletableFuture<T>
19
JAX-RS2.1–CompletableFuturevsInvoca@onCallback
P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ReacUveClientAPI-CompletableFuture<T>
20
JAX-RS2.1
P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ReacUveClientAPI
• ClientRXAPIisextensible• RxInvoker<T>• InvocaUon.Builder– <TextendsRxInvoker>Trx(Class<T>clazz)• Guava–ListenableFuture• RxJava–Observable• …
– SpecificaUonitselfmostlikelywon’trequiresupportforanythingelsethanCompletableFuture<T>,butimplementaUonsCANprovidesupportforwhatevertheylike.
21
JAX-RS2.1
E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ReacUveClientAPIinJersey
• NiceexampleofimplementaUonfirstapproach– hhps://github.com/jersey/jersey/tree/master/ext/rx
• (similartoSSE,whichwasalsoimplementedinJersey..LongUmeago.Inthisgalaxy.)
22 E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
TradiUonalSynchronousRequest/ResponseCode@Path("store") public class StoreResource { @QueryParam("userId") String userId; @GET @Path("wishlistedPromotions") public List<PromotedProduct> getWishlistedPromotions() { List<PromotedProduct> result = new LinkedList<>(); for (String productId : userManagementService.getWishlistedProducts(userId)) { List<Promotion> promotions = promotionService.getPromotionsFor(productId); Product product = productCatalog.getDetail(productId); result.add(new PromotedProduct(promotions, product)); } return result; } … }
ConfidenUal–OracleInternal/Restricted/HighlyRestricted 23 E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
@Path("store")publicclassStoreResource{@QueryParam("userId")StringuserId;privatevola@lebooleandone=false;privatefinalTransferQueue<PromotedProduct>events=newLinkedTransferQueue<>();@GET@Path("wishlistedPromo@ons")@Produces("text/event-stream")publicvoidgetWishlistedPromoUons(@SuspendedfinalAsyncResponseasyncResponse){asyncResponse.resume(newStreamingOutput(){@Overridepublicvoidwrite(OutputStreamout){while(!done){PromotedProductproduct=events.take();out.write(product.toSseJson());}}});
CompletableFuture<ServletInputStream>productIdStreamFuture=userManagementService.getAsyncWishlistedProducts(userId);productIdStreamFuture.whenComplete((servletInput,excepUon)->{if(excepUon!=null){asyncResponse.resume(cause);}servletInput.setReadListener(newReadListener{@OverridepublicvoidonDataAvailable(){try{do{OpUonal<String>productIdOpUonal=readNextProductId(input);productIdOpUonal.ifPresent(this::processProductId);}while(input.isReady());}catch(IOExcepUone){handleExcepUon(e);}}@OverridepublicvoidonAllDataRead(){done=true;}@OverridepublicvoidonError(Throwablet){handleExcepUon(t);}});});}
ConfidenUal–OracleInternal/Restricted/HighlyRestricted 24
privateprocessProductId(StringproductId){CompletableFuture<List<PromoUon>>promoUonsFuture=promoUonService.getAsyncPromoUonsFor(productId);CompletableFuture<Product>productFuture=productCatalog.getDetail(productId);promoUonsFuture.thenCombine(productFuture,(promoUons,product)->{events.transfer(newPromotedProduct(promoUons,product))}).excepUonally(this::handleExcepUon);}//…moremethods…}
ProgrammaUc(Semi)ReacUveCode
E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
DeclaraUveReacUveCode@Path("store") public class StoreResource { @QueryParam("userId") String userId; @GET("wishlistedPromotions") @SseSource(emitOn="productId") public PromotedProduct getWishlistedPromotion(
@Result List<Promotion> promotions, @Result Product product) { return new PromotedProduct(promotions, product); } @Result public List<Promotion> getPromotions(@Result("productId") String productId) { return promotionService.getPromotionsFor(productId); } @Result public Product getProductDetail(@Result("productId") String productId) { return productCatalog.getDetail(productId); } @Result("productId") public EventSource<String> getProductIdEvents() { return userManagementService.getWishlistedProducts(userId); } … }
ConfidenUal–OracleInternal/Restricted/HighlyRestricted 25
ProductID
PromoUons ProductDetail
PromotedProduct
onEvent
???
getProductDetailgetPromoUons
getWishlistedPromoUon
EmitasSSEEvent
E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Non-blockingI/O
• Async/reacUveisnotnon-blocking!– Asyncprocessingusuallyjustfiresanotherthread,whichisBLOCKEDunUlitdoeswhatitneeds
• JAX-RSsupportsAsyncprocessingsince2.0(SinceServlet3.0)– Serverside• suspendcurrentthread,dotheworkindifferentone,resumetheresponse.
– Clientside• future/callback
26 P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Non-blockingI/O
• JAX-RSdefinesseveralAPIswherestandardJavaInput/OutputStreamsareused– becauseofthat,anyJAX-RSimplementaUonisblockingbydesign
• MessageBodyReaderandMessageBodyWriterwillneedtobechanged– It’snotclearhowyet– SeveralopUons,fromnewMBR/MBWinterfaces,tosomethingsimilartoServletinput/outputstream
27 P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Non-blockingI/O
• JAX-RSAPINIOProposal– NioInvoker– NioWriterHandler– NioOutputStreamextendsOutputStream
• Workinprogress…
28
JAX-RS2.1–milestone1
P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ServerSentEvents
• SpecialMediaType–“text/event-stream”– W3standard,partofHTML5
• ServertoClientcommunicaUonchannel• Textprotocol,separatemessageswithsomemetadata– event,data,id,retry
29
JAX-RS2.1
P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
HTTP/1.1200OKContent-Type:text/event-streamDate:Tue,06Sep201615:39:30GMTTransfer-Encoding:chunkedevent:custom-messagedata:JAX-RS2.1event:custom-messagedata:testevent:custom-messagedata:JavaOne2016
ServerSentEvents
30
JAX-RS2.1
Client Server
GET/sseAccept:text/event-stream
P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
HTTP/1.1200OKContent-Type:text/event-streamDate:Tue,06Sep201615:39:30GMTTransfer-Encoding:chunkedevent:custom-messagedata:JAX-RS2.1event:custom-messagedata:testevent:custom-messagedata:JavaOne2016
ServerSentEvents
31
JAX-RS2.1
Client Server
GET/sseAccept:text/event-stream
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ServerSentEvents
32
UseExecutorServiceinstead
P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ServerSentEvents
33 P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ServerSentEvents
34 P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ServerSentEvents
• EvenbeherwithHTTP/2• SharedTCPconnecUon– onestreamcanbeusedasaSSEchannel(servertoclient)– otheroneasaclienttoserver
• ThissetupisstarUngtobecomparabletoWebSocket– ButsUllnotthesame
• WebProtocolsforJavaDevelopers[CON4156]–Embarcadero@Parc55,Thu11:30am
35
JAX-RS2.1
E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
IntegraUonswithotherSpecificaUons
36 P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
IntegraUonwithJSON-B
• JSR367–Java™APIforJSONBinding– NewspecificaUontobeintroducedinJavaEE8
• SeamlessintegraUon,similartowhatJAX-RSprovidesforJAX-B• Officialsupportfor“applicaUon/json”• ConfigurablebindingproperUes– Forma�ng,encoding,namingandorderingstrategies,adapters,…
37 P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ImprovedCDIintegraUon
• Improvedbehaviorofresources,whicharealsoCDIbeans• ConstructorselecUon• Genericproducers– @PathParam(“param”)Stringparam
• BootstrappingandrunningoutsideofJavaEE– StandaloneJavaSEApplicaUon
• ImplementaUonperspecUve– ItwouldbereallynicetohavetheopUontoselectrunUmeDIframework• HK2vsCDIvsGuicevs…
38
JAX-RS2.1
P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
JavaEESecurityAPI
• JAX-RS2.0alreadycontainssupportforSecurity– InjectSecurityContext• AuthenUcaUonscheme• Userprincipal
• Jerseysupports@DenyAll,@PermitAll,@RolesAllowed• SecurityspecificaUonisgoingtoaddOAuthandOpenIDConnectsupport
39 P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
IntegraUonwithJavaEEConfiguraUonspecificaUon
• StandardConfiguraUonAPI• ExternalizedconfiguraUon• Supportforvariouspropertyformats,Layering,Overrides• SupportformulUpleconfiguraUonsources• MutableandimmutableconfiguraUonproperUes
• ConfiguraUonforJavaEE8andtheCloud[CON7979]–Wednesday,11:30
40 P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
IntegraUonwithJavaEEConfiguraUonspecificaUon
41 P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Circuitbreakers
42
Closed Open
HalfOpen
failcountreached
ResetUmeout
failsuccess
successorfail
E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Circuitbreakers
• GenericwaytodealwithfailuresinremoteserviceinvocaUonprocess• ProtecUngsystemresourcesbymonitoringcallstoremoteservice– Ifsomecertainnumberoffailuresisreached,nofurthercallsaremadeandtheerrorisreturnedimmediately– Whenacircuitis“open”,errorsuppliermightprovidereplacementanswer• Couldbecompletelydifferent(empty)answer,orcachedvaluefromprevioussuccessfulinvocaUon
• SeveralHTTPproperUeswhichcouldtriggerfailure– TCPlevel:connecterror,connectUmeout,connecUonUmeout,..– HTTPlevel:statuscode,…
43 E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Circuitbreakers–JAX-RS
• ProgrammaUcapproach–changeintheJAX-RSclientAPI• DeclaraUveapproach–registering@ProviderclassestotheClient• Somethingelse…
• ConfigurableSLA(success/failevaluaUonandthreshold)perexternalservice• Expertgroupwilldecidewhetherorhowisthisgoingtobeincluded
44 E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
HTTP/2andJAX-RS
• DoesJAX-RSneedstobeupdatedtoworkontopofHTTP/2?– HTTP/2issUllrequest/response– Newfeaturesaremostlyimplementedinlowerlayers
• WillbeJAX-RSAPIfasteronHTTP/2?– HTTP/2isbinaryprotocol–ifyouaresending/receivingbinarydata,you’llgetinstant1.333boostofthroughput.(Base64)– Resource-wise,HTTP/2ismoreeffecUvethanitspredecessor– PersistentconnecUons,streams*,compressedheaders,…– BeawareofnumberofobjectsneededtoprocesssingleHTTPrequest
45 E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
HTTP/2andJAX-RS
• Servlet4.0:StatusUpdateandHTTP/2ComestoJavaEE8[CON7980]Tuesday,Sep20,4:00p.m.-5:00p.m.|Parc55-CyrilMagninII/III
46 E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
HTTP/2andJAX-RS
• HowtouseHTTP/2featuresfromJAX-RS?– JAX-RSServletintegraUon– InjecUngHhpServletRequest,HhpServletResponse,ServletContext,ServletConfig
47
Ume
HTTP/1.x HTTP/2 HTTP/2+Push
E
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.| 48
EngageJavaEECommunity• FeedbackthroughSurvey• LaunchJavaEENextJSRs
2016JavaEE8• Specs,RI,TCKcomplete• IniUalmicroservicessupport• DefineJavaEE9• EarlyaccessimplementaUonofJavaEE9
JavaEE9• Specs,RI,TCKcomplete• ModularJavaEErunUme• Enhancedmicroservicessupport
JavaEERoadmap
2017
2018
P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
NextSteps
• Takethesurvey– hhp://glassfish.org/survey
• Sendtechnicalcommentsto– [email protected](JAX-RS)– [email protected](JavaEE)
• JointheJCP–cometoHackergardeninJavaHub– hhps://jcp.org/en/parUcipaUon/membership_drive
• JoinortracktheJSRsastheyprogress– hhps://java.net/projects/javaee-spec/pages/SpecificaUons
• Adopt-a-JSR– hhps://community.oracle.com/community/java/jcp/adopt-a-jsr
Giveusyourfeedback
49 P
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
WheretoLearnMoreatJavaOne
50
SessionNumber SessionTitle Day/Time
CON1558 What'sNewintheJavaAPIforJSONBinding Monday5:30p.m.
BOF7984 JavaEEfortheCloud Monday7:00p.m.
CON4022 CDI2.0IsComing Tuesday11:00a.m.
CON7983 JAX-RS2.1forJavaEE8 Tuesday12:30p.m.
CON8292 PortableCloudApplicaUonswithJavaEE Tuesday2:30p.m.
CON7980 Servlet4.0:StatusUpdateandHTTP/2 Tuesday4:00p.m.
CON7978 SecurityforJavaEE8andtheCloud Tuesday5:30p.m.
CON7979 ConfiguraUonforJavaEE8andtheCloud Wednesday11:30a.m.
CON7977 JavaEENext–HTTP/2andREST Wednesday1:00p.m.
CON6077 TheIllusionofStatelessness Wednesday4:30p.m.
CON7981 JSF2.3 Thursday11:30a.m.
P