JAX-RS 2.1 Java API para RESTful Web Services foi liberada recentemente. De acordo com Santiago Pericas-Geertsen, membro principal da equipe técnica na Oracle e líder de especificações para a JSR, o JAX-RS 2.1 inclui o suporte para eventos server-sents, JSON-B e suporte aperfeiçoado para o JSON-P. A API também conta com uma extensão reativa para a API client, com suporte para o Java 8 CompletionStage e um ponto de extensão para outras APIs reativas como o RxJava.
De acordo com a especificação do JAX-RS 2.1, o foco desta release inclui anotações para POJOs, API flexível com suporte de alto nível para padrões de uso comum HTTP e aplicações incluindo WebDAV e o Atom Publishing Protocol. A API suporta uma série de tipos de conteúdo de HTTP entity body, servlet containers e JAX-WS Providers. Por fim, a API tem suporte à funcionalidades Java EE e componentes dentro de uma classe de recurso web.
O InfoQ conversou com Pericas-Geertsen, que elaborou server-sent events:
Server-sent-event (SSE) injetam um tipo especial chamado SseEventSink e produzem text/event-stream. Clientes SSE usam um SseEventSource para ler eventos de uma conexão.
Este mecanismo usa conexões de longa duração e broadcasting, que proporciona um desempenho melhorado sobre pooling, uso intensivo de recursos e conexões de curta duração.
O bloco a seguir ilustra o uso do SSE.
Server:
@GET
@Produces(MediaType.SERVER_SENT_EVENTS)
public void getMessageQueue(@Context Sse sse, @Context SseEventSink eventSink) {
// Resource method is invoked when a client subscribes to an event stream.
// That implies that sending events will most likely happen from different
// context - thread / event handler / etc, so common implementation of the
// resource method will store the eventSink instance and the application
// logic will retrieve it when an event should be emitted to the client.
// sending events:
eventSink.send(sse.newEvent("event1"));
}
Cliente:
WebTarget target = ClientBuilder.newClient().target("server-sent-events");
SseEventSource eventSource = SseEventSource.target(target).build();
// EventSource#register(Consumer)
// Registered event handler will print the received message.
eventSource.register(System.out::println);
// Subscribe to the event stream.
eventSource.open();
Pericas-Geertsen adicionou:
- JAX-RS 2.1 é totalmente compatível com as versões anteriores;
- As novas funcionalidades se integram muito bem com os conceitos existentes do JAX-RS. Por exemplo, simplesmente injetando uma chamada de método em uma invocação cliente pode mudar o processamento de síncrono para reativo;
- SSE depende da transmissão de conexões baseadas em HTTP, por isso é uma extensão natural das APIs existentes.
Uma vez que a API utiliza extensivamente annotations e expressões lambdas, a nova versão suporta aplicações desenvolvidas no Java SE 8 ou superior.