Rodrigo Lazoti Blog

Desenvolvimento de software e tecnologia em geral

Siga-me no Twitter!RSS Feeds

  • Início
  • iPhone Apps
  • Publicações
  • Downloads
  • Sobre o Autor
  • Contato

Gerando Log de EJB com Interceptor e Log4J

10/02/09

Escrito por Rodrigo Lazoti em Artigos

3 comentários

Uma forma simples de gerar log de uma aplicação é utilizando bibliotecas como Log4J ou Commons Logging, mas ficar incluindo em todas as classes necessárias, chamadas a métodos para gerar log pode ser uma tarefa muito repetitiva.

O Spring framework resolve esse problema utilizando AOP (programação orientada a aspectos), onde podemos criar uma classe que inspeciona e gera os logs de chamadas a métodos de outras classes, assim economizamos tempo e poupa-se código também.

Utilizando a espeficicação EJB 3.0 podemos também nos beneficiar de um recurso parecido com o utilizando pelo Spring na qual chama-se Interceptors, com ele podemos interceptar chamadas aos métodos de negócio dos nossos Sessions Beans e Message Driven Beans.

Para demonstrar seu funcionamento, Vou criar um pequeno exemplo utilizando um Stateless Session Bean e um Interceptor utilizando Log4J, porém este post não visa explicar como configurar um projeto EJB e a ferramente Log4J, mas simplesmente demonstrar como utilizar Interceptors em uma simples aplicação que utiliza EJB.

Primeiro vou criar o Interceptor, o método intercept tem a finalidade de gerar o log de todas as classes que ele interceptar, o método é definico com a anotação @AroundInvoke, este método pode se encontrar em uma classe separada (como no exemplo a seguir) ou no próprio session bean, lembrando apenas que só pode ter um único método anotado por classe, mas nada impede de termos várias classes de interceptors.

package br.com.rodrigolazoti;

import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

import org.apache.log4j.Logger;

public class LoggerInterceptor {

@AroundInvoke
public Object intercept( InvocationContext invocationContext ) throws Exception {
Logger log = Logger.getLogger( "myProject" );
String methodName = invocationContext.getMethod().getName();
String className = invocationContext.getTarget().getClass().getName();

log.debug( "Calling Method: " + className + "." + methodName );
long timeBefore = System.currentTimeMillis();

try {
return invocationContext.proceed();
}
catch ( Exception e ) {
log.error( "Error on calling method " + className + "." + methodName );
log.error( "Root cause: ", e );
throw e;
}
finally {
long timeAfter = System.currentTimeMillis();
log.info( "Method " + className + "." + methodName + " called in " +
( timeAfter - timeBefore ) + "ms" );
}
}
}

Agora vou criar o interface remota do meu session bean:

package br.com.rodrigolazoti;

import javax.ejb.Remote;

@Remote
public interface MyServiceBean {
Integer sum( Integer[] values );

String createWelcomeMessage( String name );
}

Finalmente a implementação do session bean, repare que utilizo a anotação @Interceptors, onde posso definir um ou mais interceptors para esta classe, podemos também definir um interceptor para um método ou até mesmo excluir um interceptor de um método ou classe utilizando a anotação @ExcludeClassInterceptors. Utilizando a configuração via XML podemos definir um interceptor para um grupo de ejb’s por exemplo.

Mais >

EJB, Interceptors, Log4J, Session Bean
img_2049

Goodbye HTC Touch, welcome IPhone!

08/02/09

Escrito por Rodrigo Lazoti em IPhone

2 comentários

Depois de alguns meses curtindo meu HTC Touch, resolvi aproveitar o fim do meu contrato com a Claro e alguns pontos que eu tinha na Clube Claro, para utilizar num deconto legal e comprar um Iphone 3G de 8Giga com direito a uma camiseta promocial com uma maça estampada ! rsrs

Abaixo uma foto comparativa entre os dois aparelhos.

img_2049

A transição de um aparelho para o outro foi muito simples, pois já estava acostumado a utilizar touchscreen no Htc, então para me acostumar com a interface do iphone foi bem rápido, só preciso me acostumar que agora não preciso mais da caneta styllus para clicar em pequenas partes da tela rsrs.

Todos os contatos do htc estavam sincronizados com o Outlook que tenho no Desktop da minha esposa (utilizo linux no meu note), e com isso bastou uma sincronização do iphone pelo itunes (novamente utilizando desktop da patroa! :(   … ) para que todos meus contatos fossem transferidos para ele.

img_2051

A caixa do iphone é muito menor que a do touch, no mínimo umas 3 vezes e a documentação (manual e outras papeladas) que vem também é bem inferior e resumida. Uma outra coisa que senti falta no iphone, é que o htc touch vem com uma capa tipo luva de neoprene e uma película protetora para a tela. Em contrapartida o iphone é bem mais rápido e com a tela mais sensível que o htc.

Ainda não instalei nada da App Store, mas aceitos dicas de programas legais que não podem faltar no iphone.

E caso alguém saiba como utilizar algum app nativo do linux para sincronização ( itunes pelo wine não rolou! :’(  ), por favor, me avise!!!

Interessados no HTC Touch completo (+cartao 2Giga +Carregador veicular), entrar em contato. :D

claro, htc, IPhone, touch

Descobrindo as exceptions encobertas pelo ADF Faces

28/01/09

Escrito por Rodrigo Lazoti em ADF

Nenhum comentário

Atualmente estou desenvolvendo um sistema utilizando ADF Faces na IDE da Oracle JDeveloper 10.1.3.4 e passei por um problema interessante. Estava ocorrendo um problema na minha aplicação mas não era gerado nenhuma exception no console, onde após determinada ação da aplicação era impresso no console apenas:

15/01/2009 17:32:31 oracle.adf.controller.faces.lifecycle.FacesPageLifecycle addMessage
WARNING: JBO-29000: null

Mensagem muito interessante e muito muito muito explicativa, não acham !?! :D

Depois de muito pesquisar, acabei encontrando uma forma de exibir o que ocasionou o JBO-29000 e é bem simples de implementar, a idéia principal é sobrescrever o métdo addMessage da classe FacesPageLifecycle e utilizá-la como o novo ADFPhaseListener do projeto.

Primeiro vou extender a classe FacesPageLifecycle e sobrescrever o metodo addMessage para ter o novo comportamento (mostrar a exception):


package br.com.rodrigolazoti.view.adf;

import javax.faces.context.FacesContext;
import oracle.adf.controller.faces.lifecycle.FacesPageLifecycle;
import oracle.binding.AttributeBinding;

public class MyPageLifecycle extends FacesPageLifecycle {

protected void addMessage(FacesContext context, AttributeBinding binding, Throwable error) {
super.addMessage( context, binding, error );
//aqui mostro o erro no console, log4j ou onde preferir
error.printStackTrace();
}

}

Agora eu extendo a classe ADFPhaseListener e retorno a minha classe criada acima ao invés de retorna a FacesPageLifecycle padrão do ADF:


package br.com.rodrigolazoti.view.adf;

import oracle.adf.controller.faces.lifecycle.ADFPhaseListener;

import oracle.adf.controller.v2.lifecycle.PageLifecycle;

public class MyPhaseListener extends ADFPhaseListener {
protected PageLifecycle createPageLifecycle() {
return new MyPageLifecycle();
}
}

Agora basta subistituir o ADFPhaseListener original pelo criado acima no arquivo de configuração do JSF (faces-config.xml):

<pre class="code"><lifecycle>
<phase -listener>br.com.rodrigolazoti.view.adf.MyPhaseListener</phase>
</lifecycle></pre>

Com isso foi fácil descobrir o motivo da mensagem e o que estava acontecendo de errado na aplicação. ;)

ADF, Java, JDeveloper, JEE, JSF, Oracle
« Primeira...«7891011»...Último »
  • My Linkedin Profile My Github Profile My photos on Flickr
    My Twitter My RSS Feeds My DZone Links

  • Idioma

    INGLES
    PORTUGUES

  • Recomendado

    Quer saber mais sobre desenvolvimento para Mac e iPhone SDK?

    www.macdevelopers.com.br

  • Categorias

    • ADF (1)
    • Ajax (2)
    • Artigos (11)
    • Banco de Dados (2)
    • Certicações (2)
    • Chromium OS (1)
    • Delphi (5)
    • Design Patterns (1)
    • Eclipse (3)
    • EJB (3)
    • Eventos (7)
    • Firebird (1)
    • IDE (4)
    • IMasters (1)
    • IPhone (5)
    • Java (25)
    • Java Magazine (1)
    • Javascript (4)
    • Jboss Seam (1)
    • JDeveloper (1)
    • JPA (1)
    • JSF (4)
    • Linux (2)
    • Livros (4)
    • Log4J (1)
    • Mac OS X (7)
    • MySQL (1)
    • Netbenas (1)
    • Objective-C (3)
    • Oracle (1)
    • Programação (37)
    • Promoções (2)
    • Ruby (4)
    • Ruby on Rails (3)
    • Sem categoria (2)
    • Sistema Operacional (5)
    • Spring Roo (1)
    • Sql (1)
    • Struts (1)
    • Testes Unitários (1)
    • Twitter (1)
    • Wordpress (2)
  • Tópicos recentes

    • Dominando o Spring Roo, publicado na Java Magazine 79
    • Alteração de feed RSS
    • Testando JavaEE 6 com Glassfish e Eclipse
    • Dev in Sampa 28/11, eu Vou!
    • [Video] Testando o Chromium OS no Virtual Box
  • Últimos comentários

    • jorge cruz em Dominando o Spring Roo, publicado na Java Magazine 79
    • Ademar em Testando JavaEE 6 com Glassfish e Eclipse
    • Lorena em Framework javascript Extjs em páginas jsp com tags tld
    • gleydson santos de souza em Criptografia Triple DES em Java
    • paulo em Filtrando requisições em JSF com PhaseListener
    • Rodrigo Lazoti em Testando JavaEE 6 com Glassfish e Eclipse
  • Meus tweets recentes

    Carregando tweets...
    Siga-me no Twitter!
  • Lista de Links

    • Akita on Rails
    • Anderson Leite
    • Cássio Marques
    • Desenvolvedores da Caelum
    • Diego Carrion
    • Fabio Kung
    • Fernando Meyer
    • Guilherme Chapiewski
    • Paulo Poiati
    • Rodrigo Urubatan
  • Visitantes Online

Direitos autorais © 2010 Rodrigo Lazoti Blog