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... } }