Quarkus Bookmarks

Published: 2020-05-05, Updated: 2023-03-12

Exemplos

Links

Iniciando um projeto

Gerando projeto para gradle

mvn io.quarkus:quarkus-maven-plugin:2.3.1.Final:create \
  -DprojectGroupId=my-groupId \
  -DprojectArtifactId=my-artifactId \
  -DprojectVersion=my-version \
  -DclassName="org.my.group.MyResource" \
  -Dextensions="resteasy-jsonb" \
  -DbuildTool=gradle

Beans

Eager initialization do Bean / Rodar codigo ao subir a app

Option 1

@Singletion
public class SomeBean {
  void onStart(@Observes StartupEvent ev) { 
  }
}

Option 2

@Startup
@Singletion
public class SomeBean {
  @PostConstruct
  void onStart() { 
  }
}

Ouvir deslagamento da app

public void close(@Observes ShutdownEvent event) throws Exception {
  this.consumerFactory.close();
}

Pegar um bean de forma estática

CDI.current().select(clazz).get()

Padrão de logs

quarkus.log.level=INFO
quarkus.log.category."io.agroal".level=TRACE
quarkus.log.category."org.apache.http.client.protocol.ResponseProcessCookies".level=ERROR
quarkus.log.console.format=%d{HH:mm:ss.SSS} [%15.-15t] %-3.3p %i %0.-35C m=%M:%L %m%n
%prod.quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss.SSS} [%15.-15t] %-3.3p %i %0.-35C m=%M:%L %m%n

Setar propriedades via env ou system property ao iniciar o quarkus

Variável de ambiente `QUARKUS_PROFILE` ou system property `quarkus.profile`


System.setProperty("quarkus.http.port", String.valueOf(config.getWebServerPort()));
System.setProperty("quarkus.log.level", config.getLogLevel().name());
System.setProperty("quarkus.log.console.enable", "false");
System.setProperty("quarkus.log.file.enable", "false");

Gerar artefato no próprio site

Info sobre postagem/consumo kafka

Profiles

Comportamento dos profiles

Para forçar um profile

Variável de ambiente QUARKUS_PROFILE ou system property quarkus.profile

Pegar o profile atual

Forma 1

ConfigUtils
  .getProfiles()
  .contains("test")

Forma 2

ProfileManager.getActiveProfile();

Testando e fazendo mocks de beans

testImplementation("io.quarkus:quarkus-junit5-mockito")

Mockando um bean singleton (Forma 1)

@QuarkusTest
class SolverSystemTest {

  @InjectMock(convertScopes = true)
  DockerRepository dockerRepository;
....

Mocando um Bean (Forma 2)

@InjectMock
SteamAPI steamAPI;


@Test
void test(){
  doReturn("").when(mock).someCall(); 
  ....
}

Mocando um Bean (Forma 3)

@Inject
SteamAPI steamAPI;

@BeforeAll
static void beforeAll(){
  final var mock = mock(SteamAPI.class);
  doReturn("").when(mock).someCall(); // os mocks tem que ser feitos aqui nessa abordagem
  QuarkusMock.installMockForType(, SteamAPI.class);
}

Autenticação com Quarkus

Via anotação: Checar a role do usuário

@GET
@RolesAllowed("user")
@Path("/me")
@Produces(MediaType.TEXT_PLAIN)
public String me() {

Programaticamente: Checar a role do usuário

@GET
public boolean me(@Context SecurityContext securityContext) {
  return securityContext.isInRole("admin");
}

ou

import io.quarkus.security.identity.SecurityIdentity;


@Path("/api/users")
public class UserResource {
  @Inject
  SecurityIdentity securityIdentity;
  @GET
  public String me() {
    return securityIdentity.getPrincipal().getName();
  }
.....

Injetar HttpRequest

@Path("/api/public")
public class PublicResource {

  @GET
  @Produces(MediaType.TEXT_PLAIN)
  public String publicResource(@Context HttpRequest r) {

Config Properties vs ConfigMapping

https://github.com/quarkusio/quarkus/issues/22101

Pegar Bean a partir de um contexto estático


CDI.current().select(SecurityIdentity.class).get()

Arc.container().instance(clazz).get()

Configurar main method

package com.acme;

import io.quarkus.runtime.annotations.QuarkusMain;
import io.quarkus.runtime.Quarkus;

@QuarkusMain  
public class Main {

    public static void main(String ... args) {
        System.out.println("Running main method");
        Quarkus.run(args); 
    }
}

Criar bean

@Produces
ProcessDAO processDAO() {
  return this.factory.processDao();
}

Injetar lista de Beans


import javax.enterprise.inject.Instance;

....

@Inject
public ServerStarter(Instance<Solver> solvers, SimpleServer server) {
  this.solvers = Solvers.sorted(Instances.toSet(solvers));
}

....


public static <T> Set<T> toSet(Instance<T> instance) {
  return instance
    .stream()
    .collect(Collectors.toSet())
    ;
}

Definindo Bean Default quando tiver várias implementaçoes

@DefaultBean
public class DockerRepositoryDefault implements DockerRepository {
....
}

Tambem funciona para Beans definidos em métodos

Criando APIs JSON com Quarkus

O Quarkus sozinho vai serializer pra voce usando jackson, também é possivel setar o seu próprio ObjectMapper

Teste Nativo / Native Test @QuarkusIntegrationTest

@QuarkusIntegrationTest
class SolverSystemIT {

  @Test
  void mustDeserializeNetworkVO(){
.....

./gradlew clean build testNative -i

Nome do jar / archive

# nao testei
quarkus.package.runner-suffix=

# vai tirar a versão do nome, ficando apenas como especificado
quarkus.package.output-name=dns-proxy-server

# vai tirar o suffix "runner", tambem pode ser passado um valor customizado
quarkus.package.add-runner-suffix=false

# vai gerar o uber jar e native image binary no diretorio build/artifacts ao inves de build
quarkus.package.output-directory=artifacts

Mais detailhes em

# https://github.com/quarkusio/quarkus/issues/2931
# quarkus-core-deployment-2.16.0.Final.jar!/META-INF/quarkus-javadoc.properties

Adicionar parâmetros no build da imagem nativa, native-image

 ./gradlew build -Dquarkus.package.type=native -i -x check -Dquarkus.native.additional-build-args="--native-image-info","--verbose"

Cacheando

quarkus commands, quarkus examples


Isolamento Acústico de Parede / Orçamento Speed Run Resident Evil 4

Comments