segunda-feira, 26 de julho de 2010

"SystemPrintln" Genérico no JBoss ESB

Um cliente a uns dias atrás me procurou para saber alguns detalhes técnicos do JBoss ESB, entre eles, sobre se existia uma forma "genérica" de imprimir passo a passo o processamento de uma mensagem. O que ele queria na prática, era que a cada ação executada no pipeline de um serviço, que a mensagem fosse exibida no log de mensagens do servidor. Segundo ele, criar uma ação do tipo "SystemPrintln" logo após cada ação era algo inviável quando você possui um projeto com mais de 20 serviços e com 10 ações por cada serviço. Irrefutávelmente eu concordei com ele :-)

Resolvi então explorar este requisito através do recurso de filtros do JBoss ESB, uma funcionalidade bastante interessante mas pouco explorada na documentação da plataforma ou dos "samples" que acompanham o ESB. O recurso de filtros é uma forma de realizar um pré ou pós processamento a cada vez que uma mensagem é processada por uma ação de um pipeline qualquer. A estratégia de implementação dos filtros no JBoss ESB não é muito diferente da usad
a na API de Servlets no Java EE. Em verdade, a abordagem é exatamente a mesma, exceto pelo fato de que o que está sendo filtrado não é uma requisição HTTP e sim, uma mensagem que pode estar em qualquer formato aceito pelos listeners do JBoss ESB, tais como JMS, SOAP, XML, EDI, TXT, JSON, etc.



Para criar um filtro para o JBoss ESB, você deve criar uma classe que estenda a classe org.jboss.soa.esb.filter.InputOutPutFilter. Esta classe encontra-se no arquivo JAR principal do JBoss ESB conhecido como jbossesb-rosseta.jar. Abaixo segue uma implementação que fiz para exibir a mensagem do pipeline no log do servidor. Para facilitar a implementação, usei a própria implementação de "SystemPrintln" que vem com o JBoss ESB para garantir que o mesmo tipo de lógica de log seja aplicada pelo filtro.

Repare que fiz uma rescrita do método onOutPut(), para lidar com o exato momento em que a mensagem já fora processada pela ação. Se você quiser realizar alguma lógica antes da execução da ação, sobreescreva o método onInput() disponível na classe base estendida. Os argumentos de ambos os métodos são, respectivamente, a mensagem enviada ao pipeline do serviço (criada por alguns dos gateways ou roteada por outros serviços) e uma instância de uma Map que possui parâmetros adicionais criados pelo contexto do serviço, porventura, informações sobre o ambiente da mensagem antes de ser recebida pelo ESB, como exemplo, informações de um diretório FTP caso o gateway usado seja do tipo FTP.

Para instalar este filtro no JBoss ESB, você deve editar o arquivo $JBOSS_ESB_HOME/server/$seuProfile/deployers/esb.deployer/jbossesb-properties.xml. Na seção "filters", crie uma nova entrada de filtro como mostrado abaixo. Repare que para cada filtro existe um número associado. Este número representa a ordem do filtro na cadeia de processamento. Prefira criar seus filtros para serem executados sempre depois dos filtros internos do JBoss ESB.

Você deverá criar um arquivo JAR contendo a implementação dos seus filtros e distribuir na pasta "lib" do deployer do JBoss ESB. Se você usa versões do JBoss ESB que rodam em versões inferiores à 5.0 do JBoss AS, talvez seja necessário colocar o JAR na pasta "lib"do seu profile.

Pronto! Inicie seu JBoss ESB e faça os testes. Agora, toda vez que uma mensagem for executada por um pipeline, à cada execução de uma ação um registro de log da mensagem será exibido no console ou no arquivo de logs.

Boas Integrações ;-)