A simplicidade do RxJava com consultas N1QL e Couchbase
Você já tentou consultar Couchbase usando o N1QL e a API síncrona do Java SDK? Ela funciona bem e não é particularmente difícil, mas acho que é um pouco confusa e, bem, síncrona. Há algumas maneiras diferentes de resolver isso. Você pode escrever um código melhor ou pode dar uma olhada no RxJava, que recentemente começou a me agradar.
Caso você não esteja familiarizado com o RxJava, ele é um conjunto de extensões reativas para Java semelhante ao Rx.NET e ao RxJS. A grande vantagem é que o Couchbase Java SDK se integra muito bem a esse conjunto de extensões. Vamos dar uma olhada em alguns trechos de código Java que aproveitam ao máximo o RxJava com N1QL.
Digamos que temos o código de consulta síncrona muito simples que segue:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
público estático Lista<Mapa<Cordas, Objeto>> buscar(final Balde balde) { Cordas queryStr = "SELECT META().id, title, description, type" + "FROM `" + balde.nome() + "` " + "WHERE type = 'task'"; N1qlQueryResult resultado = balde.consulta(N1qlQuery.simples(queryStr)); Lista<Mapa<Cordas, Objeto>> conteúdo = novo ArrayList<Mapa<Cordas, Objeto>>(); para(N1qlQueryRow fila : resultado) { conteúdo.adicionar(fila.valor().toMap()); } retorno conteúdo; } |
No exemplo acima, temos uma consulta N1QL simples. Após a execução da consulta, obtemos um conjunto de resultados que percorremos em loop e convertemos em um arquivo Java Mapa
e adicionar a um Lista
. Por fim, retornamos os resultados analisados. Essa análise é comum quando se trabalha com aplicativos do Spring Boot, mas não se limita a isso.
Embora o código acima não tenha sido particularmente difícil, havia muita coisa acontecendo. Com o RxJava, o código acima pode ser convertido no seguinte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
público estático Lista<Mapa<Cordas, Objeto>> getAll(final Balde balde) { Cordas queryStr = "SELECT META().id, title, description, type" + "FROM `" + balde.nome() + "` " + "WHERE type = 'task'"; retorno balde.assíncrono().consulta(N1qlQuery.simples(queryStr)) .flatMap(AsyncN1qlQueryResult::linhas) .mapa(resultado -> resultado.valor().toMap()) .toList() .tempo limite(10, TimeUnit.SEGUNDOS) .toBlocking() .único(); } |
Tudo bem, você me pegou! O código RxJava tem mais linhas, mas isso significa que ele é mais complicado ou bagunçado?
O RxJava usa observáveis que podem ser considerados valores ao longo do tempo. Eles são assíncronos e podem conter uma cadeia de operações à medida que os dados fluem pelo pipeline. Por exemplo, em nosso código acima, executamos a consulta N1QL de forma assíncrona. A consulta .flatMap
fará transformações assíncronas nos dados que são retornados na consulta de AsyncN1qlQueryResult
para digitar AsyncN1qlQueryRow
e o .mapa
transformará cada uma das linhas retornadas em um arquivo Java Mapa
. Porque queremos um Lista
de Java Mapa
podemos chamar toList
que fará exatamente isso. Como não queremos trabalhar com um observável, no final chamamos toBlocking
que converte o resultado em um valor iterável ou, no nosso caso, em algo com que a função pai ou talvez o front-end possa trabalhar. Por fim, terminamos com .single
porque sabemos que só retornaremos uma vez Lista
.
O RxJava é poderoso e pode ser aplicado a coisas muito mais complicadas do que o exemplo acima. O que importa aqui é que ele é simples de usar e oferece uma abordagem baseada em eventos para a manipulação assíncrona de dados.