“Inteceptando” métodos EJB

O EJB possui os @Interceptors que permite realizar códigos antes e depois da execução de métodos dentro do contexto EJB.

Abaixo segue um exemplo mais comum de interceptor, que é calcular o tempo de execução dos métodos de serviço.

Primeiro é preciso criar uma classe para ser seu interceptor customizado, que vai apenas conter apenas um método anotado com @AroundInvoke.


import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import org.apache.log4j.Logger;

public class LogDeServico {

   @AroundInvoke
   public Object interceptar(InvocationContext contexto) throws Exception {
       Logger log = Logger.getLogger("myProject");
       String metodo = contexto.getMethod().getName();
       String classe = contexto.getTarget().getClass().getName();

       log.debug("Chamando metodo: " + classe + "." + metodo);
       long timeBefore = System.currentTimeMillis();

       try {
            return contexto.proceed();
       } catch (Exception e) {
            log.error("erro ao chamar metodo " + classe + "." + metodo);
            log.error("exception: ", e);
            throw e;
       } finally {
            long timeAfter = System.currentTimeMillis();
            log.info("metodo " + classe + "." + metodo + " chamado em " + (timeAfter   -     timeBefore) + "ms");
      }
   } 
}

O método interceptar pega o método e a classe do contexto recebido e o tempo de inicio, em seguida manda processador o método a ser interceptado e no fim de execução subtrai tempo de fim pelo de inicio e “loga” com log4j no console essas informações.

  • @AroundInvoke : Define que o método anotado será a ação de interceptação chamada e injeta o contexto que o método a seguir será executado.
    , mais informações;
  • InvocationContext : É o contexto que o método interceptador será executado; ou seja é o contexto do método que chama o interceptor;
  • proceed() : executa o método do contexto, ou seja o método (Real) seguindo o exemplo o método testeInterceptor da classe MeuServico;

Com o interceptor pronto agora apenas declarar dentro de @Interceptors que todos métodos que estão dentro de MeuServico serão interceptador pelo logDeServico.interceptar

@Stateless
@Local(InterfaceMeuServico.class)
@Interceptors (LogDeServico.class)
public class MeuServico implements InterfaceMeuServico {

    public void testeInterceptor() {
        // faz alguma coisa...
    }
 
} 
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.