Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

JavaEE 8 on a diet with Payara Micro 5

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Wird geladen in …3
×

Hier ansehen

1 von 35 Anzeige

Weitere Verwandte Inhalte

Diashows für Sie (19)

Ähnlich wie JavaEE 8 on a diet with Payara Micro 5 (20)

Anzeige

Weitere von Payara (20)

Aktuellste (20)

Anzeige

JavaEE 8 on a diet with Payara Micro 5

  1. 1. Java EE8 on a Diet with Payara Micro 5 Mert Çalışkan, Gaurav Gupta JavaOne 2017
  2. 2. Mert Çalışkan Payara Developer Java EE / Spring Consultant Author of PrimeFaces Cookbook Author of Beginning Spring book Part-time Lecturer @mertcal Gaurav Gupta Payara Developer NetBeans Dream Team Jeddict Creator ( jeddict.github.io ) @jGauravGupta , @ImJeddict
  3. 3. React to the talk Join at slido.com #PM5
  4. 4. Agenda - What’s new with Java EE 8? - The Almighty: Payara Micro 5 - Demo w/ Conference App - Q&A @mertcal
  5. 5. What’s new with Java EE 8? Java EE 8 is released on Sep 06, 2017. ● JAX-RS 2.1 (Jersey 2.26) ● CDI 2.0 (Weld 3.0.0.Final) ● Bean Validation 2.0 (Hibernate Validator 6.0.2.Final) ● JSON-B (Yasson 1.0) ● JPA 2.2 (EclipseLink 2.7.0) ● Java Security API 1.0 (Soteria 1.0) Checkout https://github.com/javaee-samples/javaee8-samples for details on the examples @mertcal
  6. 6. ● Reactive Client API ● JSON-B support ● Server Sent Events (SSE) JAX-RS 2.1 (JSR 370) @mertcal
  7. 7. ● With JAX-RS 2.0, we had asynchronous invoker approach as: Client client = ClientBuilder.newClient(); WebTarget target = client.target("http://localhost:8080/service-url"); Invocation.Builder builder = target.request(); Future<MyClass> futureResult = builder.async().get(MyClass.class); System.out.println(futureResult.get()); client.close(); JAX-RS 2.1 @mertcal
  8. 8. ● Previous scenario can also be implemented with InvocationCallback<T> but… Client client = ClientBuilder. newClient(); WebTarget target = client.target( "http://localhost:8080/service-url"); Invocation.Builder builder = target.request(); builder.async().get( new InvocationCallback<MyClass>() { @Override public void completed(MyClass t) {} @Override public void failed(Throwable throwable) {} }); JAX-RS 2.1 @mertcal
  9. 9. ● Reactive Client API to the rescue. Client client = ClientBuilder.newClient(); WebTarget target = client.target("http://localhost:8080/service-url"); Invocation.Builder builder = target.request(); CompletionStage<Response> response = builder.rx().get(); response.thenAcceptAsync(res -> { MyClass t = res.readEntity(MyClass.class); System.out.println(t); }); JerseyCompletionStageRxInvoker CompletionStage<Response> JAX-RS 2.1 @mertcal
  10. 10. ● 3rd Party Reactive Framework Support ○ RxJava Client client = ClientBuilder.newClient().register(RxFlowableInvokerProvider.class); WebTarget target = client.target("http://localhost:8080/service-url"); Invocation.Builder builder = target.request(); Flowable<Response> flowable = builder.rx(RxFlowableInvoker.class).get(); flowable.subscribe(res -> { MyClass t = res.readEntity(MyClass.class); System.out.println(t); }); reactive invoker specialized for io.reactivex.Flowable JAX-RS 2.1 @mertcal
  11. 11. Client client = ClientBuilder.newClient().target("http://localhost:8080/service-url") .request() .get(); Client client = ClientBuilder.newClient().target("http://localhost:8080/service-url") .request() .async() .get(); Client client = ClientBuilder.newClient().target("http://localhost:8080/service-url") .request() .rx() .get(); JAX-RS 2.1 @mertcal
  12. 12. ● Server Sent Events (SSE) is a mechanism that allows server to asynchronously push data from the server to client once the client-server connection is established by the client. ● It’s mostly like Long-Pooling but it’s not :) and it’s not WebSockets either. ● Implementations already provided it with JAX-RS 2.0 but there was no standard API. With JAX-RS 2.1, API is created under javax.ws.rs.sse JAX-RS 2.1 @mertcal
  13. 13. @Path("/temperature") public class TemperatureResource { private final OutboundSseEvent.Builder sseEventBuilder; public TemperatureResource( @Context Sse sse) { this.sseEventBuilder = sse.newEventBuilder(); } @GET @Path("/{city}") @Produces(MediaType.SERVER_SENT_EVENTS) public void getCurrentTemperatureStream( @Context SseEventSink eventSink) { while (true) { eventSink.send( sseEventBuilder.data(temperature) .mediaType(MediaType. APPLICATION_JSON_TYPE).build()); Thread. sleep(1000); } } } "text/event-stream" 1 2 3 4 JAX-RS 2.1 @mertcal
  14. 14. CDI 2.0 (JSR 365) - SE Support - It’s possible to use CDI outside of Java EE - Ordering of CDI events - @Priority helps ordering observers void receive(@Observes @Priority(APPLICATION + 200) String greet) { this.greet += greet + "2"; } void receive2(@Observes @Priority(APPLICATION) String greet) { this.greet = greet + "1"; } For send(“Welcome”) output will be: Welcome1Welcome2 @Inject private Event<String> event; public void send(String message) { event.fire(message); } @mertcal
  15. 15. CompletableStage<MyEvent> eventSent = event.fireAsync( new MyEvent(), NotificationOptions.ofExecutor(executor)); - Exception in async observer doesn’t break the observer invocation chain. callMe(@Observes payload) callMe(@ObservesAsync payload) event.fire(payload) Sync call Not Notified event.fireAsync(payload) Not Notified Async call - Long awaited Asynchronous Events Support - Fire Sync → Observer Sync / Fire Async → Observer Async CDI 2.0 @mertcal
  16. 16. ● Java 8 Date and Time API Support @Past(message = "must be a past date") private java.time.Year yearOfBirth; ● Type Annotations private List<@NotNull @Email String> emails; private String @NotNull @Email[] emails; private Map<@Valid Employee, @Valid Address> addressMap = new HashMap<>(); @mertcal Bean Validation 2 (JSR 380)
  17. 17. ● java.util.Optional Support private Optional<@Past LocalDate> marriageAnniversary; private Optional<@Size(max = 20) String> name; ● Repeating Annotations @Max(value = 2000, groups = Default.class) @Max(value = 5000, groups = GoldCustomer.class) private long withdrawalAmount; @mertcal Bean Validation 2
  18. 18. Bean Validation 2 ● Introduces new constraints ○ @Email ○ @NotBlank ○ @NotEmpty ○ @PastOrPresent ○ @FutureOrPresent ○ @Negative ○ @NegativeOrZero ○ @Positive ○ @PositiveOrZero @mertcal
  19. 19. JSON-B (JSR 367) ● Standard solution like JAXB ● Default mapping between classes and JSON ● Customizable a. Compile time ■ Property naming @JsonbProperty ■ Property ignoring @JsonbTransient ■ Null handling @JsonbNillable ■ Property ordering @JsonbPropertyOrder ■ Date and Number Format @JsonbDateFormat/@JsonbNumberFormat ■ Adapter @JsonbTypeAdapter b. Runtime configration ■ Configuration builder JsonbConfig @jGauravGupta
  20. 20. JSON-B - Customizations class Speaker { private String name; private String pin; private String email; } { "name": "Gaurav", "pin": "J1-Secret", "email": "gaurav.gupta@payara.fish", } @jGauravGupta
  21. 21. JSON-B - Customizations @JsonbPropertyOrder({"email", "name"}) class Speaker { @JsonbProperty("speakerName") private String name; @JsonbTransient private String pin; private String email; } { "email": "gaurav.gupta@payara.fish", "speakerName": "Gaurav" } @jGauravGupta
  22. 22. JPA 2.2 (JSR 338) ● @Repeatable annotations ● Support Java 8 Date and Time API ● Ability to return stream of query result ● CDI Injection in AttributeConverters @jGauravGupta
  23. 23. JPA 2.1 Container annotation required @Entity @NamedQueries({ @NamedQuery(name = "Speaker.findAll", query = "SELECT s FROM Speaker s"), @NamedQuery(name = "Speaker.findByName", query = "SELECT s FROM Speaker s WHERE s.name = :name") }) class Speaker { @Convert(converter=LocalDateConverter.class) private LocalDate dateOfBirth; } @jGauravGupta AttributeConverter implementation
  24. 24. JPA 2.2 Container annotation not required @Entity @NamedQueries({ @NamedQuery(name = "Speaker.findAll", query = "SELECT s FROM Speaker s"), @NamedQuery(name = "Speaker.findByName", query = "SELECT s FROM Speaker s WHERE s.name = :name") }) class Speaker { @Convert(converter=LocalDateConverter.class) private LocalDate dateOfBirth; } AttributeConverter not required @jGauravGupta
  25. 25. JPA 2.2 @Entity @NamedQuery(name = "Speaker.findAll", query = "SELECT s FROM Speaker s") @NamedQuery(name = "Speaker.findByName", query = "SELECT s FROM Speaker s WHERE s.name = :name") class Speaker { private LocalDate dateOfBirth; } @jGauravGupta
  26. 26. JPA 2.2 ● Stream query results Stream<Speaker> speakers = em.createQuery(“SELECT s FROM Speaker”, Speaker.class) .getResultStream(); @jGauravGupta
  27. 27. Security API 1.0 (JSR 375) ● Simplify the existing solution ● Enhance the portability ● New APIs ○ HTTPAuthenticationMechanism ○ IdentityStore ○ SecurityContext @jGauravGupta
  28. 28. Security API 1.0 (JSR 375) ● Authentication Mechanism ○ validateRequest(request, response, httpMessageContext) ○ secureResponse(request, response, httpMessageContext) ○ cleanSubject(request, response, httpMessageContext) ● Identity Store ○ validate(credential) ○ getCallerGroups(credentialValidationResult) ● Security Context ○ getCallerPrincipal() ○ isCallerInRole(role) ○ … … … @jGauravGupta
  29. 29. @ApplicationScoped public class MyAuthMechanism implements HttpAuthenticationMechanism { @Override public AuthenticationStatus validateRequest(HttpServletRequest request, HttpServletResponse response, HttpMessageContext context) { } } Security API 1.0 @jGauravGupta
  30. 30. @ApplicationScoped public class MyAuthMechanism implements HttpAuthenticationMechanism { @Inject private IdentityStoreHandler identityStoreHandler; @Override public AuthenticationStatus validateRequest(HttpServletRequest request, HttpServletResponse response, HttpMessageContext context) { ……… identityStoreHandler.validate(credential); ……… } } Security API 1.0 @jGauravGupta
  31. 31. @ApplicationScoped public class MyAuthMechanism implements HttpAuthenticationMechanism { @Inject private IdentityStoreHandler identityStoreHandler; @Override public AuthenticationStatus validateRequest (HttpServletRequest request, HttpServletResponse response, HttpMessageContext context) { ……… identityStoreHandler.validate(credential); ……… } } Security API 1.0 @jGauravGupta
  32. 32. ● Application Server as Executable JAR ○ Small: ~70mb ● Deploy WAR files directly from command line ● Contains Java EE8 specification on board such as: ○ JAX-RS 2.1 ○ Bean Validation 2.0 ○ CDI 2.0 ○ JPA 2.2 @mertcal Payara Micro 5
  33. 33. ● Supports Automatic Clustering out of the box ○ Integrates with Hazelcast ○ Session replication with distributed caching ● JCA based Cloud Connectors ○ Amazon SQS ○ Kafka ○ MQTT ○ Azure Service Bus ● Eclipse MicroProfile Support w/ Config API Payara Micro 5 @mertcal
  34. 34. Conference App - Blending All Together w/ jeddict.github.io @Email @JsonbProperty ("speakerName") @JsonbTransient java.time.LocalDate @NamedQuery(name = "findAll") @NamedQuery(name = "findByName") @NamedQuery(name = "findByEmail") @JsonbProperty ("detail") @NotEmpty
  35. 35. Thank you! Any Questions? %50 on ebook - JE8MEK50 %15 on printed - JE8MPK15 valid until October 11

×