Rodrigo de Bona Sartor
Kugel Soft
Published in
2 min readApr 3, 2018

--

Melhoria de performance ao iniciar o Wildfly

Em 2015 iniciamos na Kugel um projeto para conversão do nosso ERP para WEB. Como uma parte desse sistema já rodava em Java e boa parte da equipe já tinha algum conhecimento em Java, decidimos criar o projeto WEB em Java EE.

O nosso projeto é divido em 4 módulos:

  • Domain (acesso o banco de dados)
  • Services (lógica de negócio)
  • Report (relatórios)
  • Web (API REST)

No início do projeto, com poucas classes e poucas tabelas, a aplicação iniciava em 25 segundos. Com o desenvolvimento de novas funcionalidades, como emissão de nota fiscal, muitas classes foram criadas e tabelas foram adicionadas ao projeto. No momento o projeto contém mais que 600 tabelas sendo que algumas tem chave composta o que faz com que o módulo Domain tenha mais que mil classes apenas para acesso ao banco.

Com o aumento do número de classes vimos o tempo de inicialização da aplicação passar de 25 segundos para 70 segundos. Considerando que cada desenvolvedor inicia a aplicação algumas vezes por dia, essa diferença de tempo estava começando a incomodar.

Para tentar identificar o que o Wildfly estava rodando durante a inicialização da aplicação, ativei alguns logs das classes do Wildfly e identifiquei que estava levando um tempo para fazer as validações do CDI (Contexts and Dependency Injection). Também identifiquei que estava validando todas as classes do projeto sendo que muitas delas nunca serão utilizadas com o CDI.

Pesquisando um pouco encontrei o CDI 1.1 com seu novo atributo “bean-discovery-mode” e que permite um dos seguintes valores:

  • none: Desativa o CDI para todas as classes
  • all: Ativa o CDI para todas as classes
  • annotated: Ativa o CDI apenas para as classes que tem annotations do CID

Todos os módulos do projeto tinham o arquivo beans.xml em branco, ou seja, o “bean-discovery-mode” estava utilizando “all” por padrão e por isso o Wildfly estava validando todas as classes.

Alterei todos os módulos, menos o Services, para “annotated” e incluí os annotations nas classes que não tinham e que utilizam CDI. O Services continuou como “all” pois não faria muita diferença, visto que 90% das classes utilizam CDI.

Após essa alteração a aplicação iniciou em 30 segundos, menos da metade do tempo anterior (70 segundos).

tl;dr: Alterando o “bean-discovery-mode” de “all” para “annotated” a aplicação demorou menos da metade do tempo para iniciar.

O arquivo beans.xml deve estar dentro de “META-INF”, exemplo:

<beans xmlns=”http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=”http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode=”annotated”
>
</beans>

--

--