quinta-feira, 12 de novembro de 2009

Criando Variáveis de Contexto no JNDI do JBoss

Este post é pra deixar registrado uma dica que acredito ser interessante pra quem desenvolve aplicações em JBoss. Um amigo me perguntou sobre isso e tendo esse tipo de coisa registrada em blog me pouca alguns minutos de pesquisa nas docs do JBoss. Vamos lá ...

Imagine que você têm uma aplicação rodando em JBoss, mas gostaria de ter parâmetros gerais definidos num arquivo externo ao módulo da aplicação. Estes parâmetros informam coisas como por exemplo, a língua e idioma que a aplicação deverá carregar nos arquivos de bundle. Uma forma simples de se fazer isso, é usando arquivos de properties. Criando um arquivo de properties num diretório qualquer, você pode carregá-lo junto com o JBoss usando a seguinte linha de comando ao iniciar o servidor:

O problema disso é que os parâmetros não podem ser atualizados. Se você alterar o arquivo, somente na próxima inicialização do JBoss que ele verá as alterações. Outra forma de se fazer isso, é usando variáveis de contexto do arquivo web.xml (No caso de aplicações baseadas em Servlets). Através das seções "context-param" você pode criar variáveis acessíveis via JNDI. Mas para isso, você deverá ter uma ferramenta que possa instrumentar o arquivo e refazer o deployment do módulo em tempo de execução, cenário este que, em alguns casos de aplicações críticas, não é adequado, pois você não pode tirar a aplicação do ar nem que seja 1 segundo!

A solução: Usando binding de variáveis no JNDI do JBoss usando MBeans

Se você quer criar váriaveis no contexto do JNDI, usando JBoss, você pode usar o MBean "JNDIBindingServiceMgr". Este é um MBean que é capaz de criar objetos de qualquer tipo no contexto do JNDI e assinalá-lo a uma variável de binding. Vamos a um exemplo. Crie um arquivo XML. Chame-o de "custom-params-service.xml" e nele coloque o conteúdo abaixo:

Repare no arquivo que ele define uma seção chamada "jndi:bindings". Você pode criar uma ou mais entradas do tipo "jndi:binding" neste seção, sendo possível então a definição de vários parâmetros num único arquivo XML. Repare também que criamos um parâmetro chamado "springFileLocation". A idéia é fazer com que qualquer componente do JBoss em tempo de execução possa, via JNDI, recuperar o valor desta variável e carregar o contexto do Spring.

Copie este arquivo para a pasta deploy do JBoss. A partir deste ponto, você pode acessar as variáveis no contexto do JNDI da seguinte forma:

Como a variável está no contexto do JNDI, se você estiver usando EJBs ou outro componente gerenciado do JEE 5, você pode injetar este parâmetro da seguinte forma:

A parte mais interessante desta abordagem é que, como se trata de um objeto gerenciado pelo JBoss, ou seja, um MBean, você pode a qualquer momento alterar o arquivo XML que as variáveis serão atualizadas no contexto do JNDI, desde que você deixe o HotDeploy do JBoss ativo ;-)

Bons Códigos!

2 comentários:

Luiz Rocha disse...

Excelente abordagem. Sem contar que ao utilizar JNDI a informação é replicada quando a arquitetura dos servidores é em cluster de instâncias, correto?

Ricardo Ferreira disse...

Oi Luiz,

Correto. Se você ligar o HA-JNDI do JBoss, ele replica os dados do JNDI pra você, transparentemente!

Abraços,