Objectivos: Prática com API assíncrona, CompletableFuture<T>
e reactive streams.
Data limite de entrega: 3 de Junho de 2019
Implemente os testes unitários necessários para validar o funcionamento das funcionalidades pedidas.
NOTA 1: não poderá criar ou usar explicitamente fios de execução (i.e.
Thread
), nem por diferimento de tarefas (i.e.
CompletableFuture.supplyAsync(...)
) nem através de qualquer outro meio.
NOTA 2: não poderá bloquear sobre o resultado das computações assíncronas
(i.e. .join()
ou .get()
) com excepção aos testes unitários.
No âmbito da biblioteca jingle pretende-se tornar a sua API assíncrona. Deverá
criar um novo projeto jingle-async
com base no anterior jingle
e adaptá-lo de
acordo com os requisitos deste enunciado.
De modo a que biblioteca jingle-async
passe a usar IO não-bloqueante, crie uma
nova a interface AsyncRequest
com um método getLines()
que tenha API
assíncrona.
A implementação desta interface para pedidos HTTP GET deve recorrer a uma
biblioteca para realização de pedidos HTTP não bloqueantes, como por exemplo
AsyncHttpClient ou
java.net.http
do JDK 11.
Da mesma forma devem ser actualizados os tipos do modelo de domínio e serviço,
para que passem a oferecer uma API assíncrona baseada no tipo
Observable
em vez de Stream
ou arrays.
Implemente uma aplicação Web usando a tecnologia VertX com handlers assíncronos. A aplicação deve disponibilizar as seguintes páginas:
- Listagem de artistas com um determinado nome recebido por query-string. Cada artista tem 2 links: uma para a listagem dos seus álbuns e outro para a listagem das suas músicas.
- Listagem de álbuns de um artista. Cada álbum tem um link para a listagem de músicas desse álbum.
- Listagem de todas as músicas de um artista.
- Listagem de músicas de um álbum.
As páginas anteriores são acessíveis através dos seguintes caminhos (paths):
/artists?name=...
/artists/:id/albums
/artists/:id/tracks
/albums/:id/tracks
A aplicação web nunca poderá bloquear (não fazer join()
e nem get()
) na
obtenção de um resultado.
As listagens devem ser retornadas no corpo da reposta HTTP em modo chunked
(response.setChunked(true)
) sendo a user-interface construída de forma
progressiva à medida que a resposta é recebida no browser.