BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Artigos Escrevendo uma aplicação em Vert.x 3

Escrevendo uma aplicação em Vert.x 3

Favoritos

Este artigo é um ponto de partida para os primeiros contatos com a programação reativa utilizando o Eclipse Vert.x. O Vert.x é um conjunto de ferramentas para construção de sistemas reativos e distribuídos, utilizando um modelo de desenvolvimento assíncrono não bloqueante. Uma de suas principais vantagens é o fato de ser poliglota, permitindo o desenvolvimento de código em diferentes linguagens como Java, JavaScript, Groovy, Ruby, Ceylon, Scala e Kotlin, todas utilizando a JVM como base.

Este artigo foi escrito por Clement Escoffier, um dos core-committers da solução. Ao longo do texto, será demonstrado como se desenvolver uma aplicação simples em Vert.x 3, como testar tal aplicação, como empacotá-la e executá-la, ou seja, tudo que se precisa saber antes de desenvolver sua própria aplicação. O código aqui apresentado está disponível no GitHub.

Mãos à obra

Todo o exemplo será feito utilizando-se o Apache Maven, mas você pode usar Gradle ou outra ferramenta de build da sua preferência. Primeiro, crie um novo projeto. Se for o caso, utilize o Maven Archetype para criar a estrutura. Basicamente, será necessário um diretório com:

  1. um diretório src/main/java
  2. um diretório src/test/java
  3. um arquivo pom.xml

Crie o arquivo pom.xml com o seguinte conteúdo:

O conteúdo do pom.xml criado é simples, contendo:

  • a declaração da dependência do vertx-core
  • a configuração do maven-compiler-plugin para usar o Java 8. Aplicações Vert.x requerem o uso do Java 8.

Implementação

Uma vez que o setup da aplicação já está finalizado, é hora de ir para o código propriamente dito. Crie a classe src/main/java/io/vertx/blog/first/MyFirstVerticle.java com o seguinte conteúdo:

A aplicação criada com essa classe é bastante simples. A classe MyFirstVerticle estende a classe AbstractVerticle. Em aplicações Vert.x, um verticle é um componente. Por estender a classe AbstractVerticle, a classe criada passa a ter acesso ao atributo vertx.

O método start é executado quando é feito o deploy do verticle. Caso necessário, é possíve também implementar o método stop. Nesse exemplo, porém, o próprio Vert.x se encarregará desse método. O método start recebe um objeto Future, que tem como objetivo informar ao Vert.x quando todos os passos de início forem finalizados ou quando houver algum erro. Uma das particularidades do Vert.x é ele ser assíncrono, ou seja, não bloqueante. Quando nosso verticle for deployado ele não irá esperar o método start ser concluído. Sendo assim, o parâmetro Future é importante para notificar a conclusão do método start.

O método start cria um servidor HTTP e atribui um handler de requisição para ele. Esse handler é um lambda passado no método requestHandler, chamado todas as vezes que o servidor recebe uma requisição. No caso desse exemplo, apenas o texto "Hello…" é retornado. Finalmente, o servidor fica escutando a porta 8080. Como pode haver falhas, por exemplo a porta pode estar em uso, passamos outra expressão lambda para verificar se a conexão foi ou não realizada com sucesso. Em caso de sucesso o método fut.complete() é executado e o método fut.fail() é executado para reportar um erro.

Compile sua aplicação utilizando o comando abaixo. Se tudo der certo, a compilação estará funcionando e essa será a aplicação a ser utilizada.

Testes

Agora que a aplicação está concluída, é necessário criar os testes para a mesma, como um bom programador cuidadoso. Os testes usam o JUnit e o vertx-unit, um framework integrado com Vert.x para realizar os testes das aplicações de uma forma mais natural.

Edite o arquivo pom.xml, adicionando as duas dependências a seguir:

Crie a classe src/test/java/io/vertx/blog/first/MyFirstVerticleTest.java com o conteúdo abaixo. Este será um teste JUnit para o verticle que foi criado. O teste usa a execução VertxUnitRunner que facilita os testes de interações assíncronas, que são a base das aplicações Vert.x.

No método setUp, foi criada uma instância de Vertx e implementado o verticle. Note que o argumento do método @Before recebe um TestContext. Este objeto permite controlar o aspecto assíncrono do teste. Por exemplo, ao implementar o verticle, ele é executado forma assíncrona, como todas as interações no Vert.x. Nada poderá ser verificado até que o verticle seja iniciado corretamente.

Como segundo argumento do método deployVerticle, é informado um manipulador de resultados: context.asyncAssertSuccess(). Dessa forma, o teste falha se o verticle não for iniciado corretamente. Além disso, ele espera até que o verticle complete seu ciclo de inicio. Lembre que no verticle implementado anteriormente o método fut.complete() é executado.

O método tearDown é simples, ele apenas finaliza a instância vertx que foi criada . O método testMyApplication é onde está concentrado, efetivamente, o teste da aplicação. O teste emite uma requisição para a aplicação criada e verifica o resultado. A emissão da requisição e o recebimento da resposta é assíncrono, o que cria a necessidade de se ter alguma maneira de gerenciar isso. Com os métodos setUp e tearDown, o método de teste recebe um TestContext. A partir deste objeto foi criado um manipulador assíncrono (async) que permite notificar o framework de teste quando o teste completou, através do async.complete().

Uma vez que o manipulador assíncrono é criado, é feita a criação de um cliente HTTP e a chamada a um manipulador de requisição HTTP pela nossa aplicação com o método getNow().O método getNow é uma redução dos métodos get(…).end(). A resposta é manipulada pelo lambda, onde o corpo da resposta é recuperado passando outro lambda para o método handler. O argumento body é o corpo da resposta, como um buffer object,. onde se verifica a existência da String "Hello", finalizando a execução do teste.

Diferentemente dos testes tradicionais com JUnit, o exemplo demonstrado utilizou context.assert. Dessa forma, se o assertion falhar, o teste será interrompido imediatamente. Por isso é muito importante sempre utilizar os métodos assertions devido ao aspecto assíncrono das aplicações e dos testes com Vert.x.

O teste criado pode ser executado a partir de uma IDE ou utilizando o Maven:

Empacotamento

Uma vez que a aplicação e seu teste estão finalizados, o próximo passo é a realização do empacotamento dos mesmos. Neste exemplo, aplicação será empacotada dentro de um fat jar. Um fat jar é um arquivo jar executável standalone contendo todas as dependências necessárias para executar a aplicação. Este é um caminho conveniente para empacotar aplicações Vert.x já que ele gera apenas um arquivo. Isso também torna mais fácil a execução da aplicação.

Para criar um fat jar, faça as seguintes alterações no arquivo pom.xml antes da tag </plugins>:

Para esse exemplo, o plugin maven-shade-plugin foi utilizado para criar o fat jar. O nome do verticle criado foi indicado no manifestEntries. A a classe Starter é uma classe do Vert.x que irá criar uma instância do vertx e implementar verticle implementado.

Com este plugin configurado vamos executar o seguinte comando Maven:

A aplicação será gerada dentro da pasta target com o seguinte nome my-first-app-1.0-SNAPSHOT-fat.jar. Dentro deste arquivo estão todas as dependências necessárias, incluindo o Vert.x.

Executando nossa aplicação

Agora que a aplicação já está empacotada em um fat jar, é possível executá-la sem maiores complicações:

Depois de disparar o comando para execução da aplicação, abra um navegador e entre no seguinte endereço: http://localhost:8080. Para parar a aplicação basta pressionar CTRL+C.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

BT