Dicas, JBoss

Configurando JBoss AS 5: principais arquivos de conf.

Se você  está acostumado com a configuração do JBoss AS 4.x (baseado no Microkernel JMX do JBoss) e começou a trabalhar com a versão 5 deve estar, como eu no início, um pouco perdido para encontrar as principais configurações espalhadas pelos novos descritores de serviços (arquivos *-service/bean.xml) na nova estrutura do JBoss AS. Na nova versão boa parte dos arquivos de conf. foram alterados por conta da nova implementação do kernel do JBoss – agora chamado JBoss Microcontainer ou simplesmente JBossMC.

Neste post pretendo mostrar a localização e alguns trechos de configuração para alguns ajustes que considero importantes e que creio fazer parte do dia a dia de um Admin. de JBoss AS. Portanto meu objetivo neste post está longe de percorrer todas as mudanças e configurações da dessa versão do JBossAS!

1) Para começar mostro onde se encontra a configuração do serviço responsável pelo controle transacional do servidor – TransactionManager.

Descritor do serviço: $JBOSS_HOME/server/default/transaction-jboss-beans.xml

Uma propriedade que geralmente precisamos ajustar é o timeout da transação (lembrando que isso altera o timet global do AS)

Trecho de conf:

<property name="transactionTimeout">600</property> <!-- alterado para 10 min (600s). -->
<property name="objectStoreDir">${jboss.server.data.dir}/tx-object-store</property>
<property name="mbeanServer"><inject bean="JMXKernel" property="mbeanServer"/></property>

2) Agora o mecanismo responsável por “monitorar” o diretório de deploy e fazer o Hot Deployment é o HDScanner.

Descritor do serviço: $JBOSS_HOME/server/default/deploy/hdscanner-jboss-beans.xml

Trecho de conf:

<!-- Hotdeployment of applications -->
 <property name="deployer"><inject bean="ProfileServiceDeployer"/></property>
 <property name="profileService"><inject bean="ProfileService"/></property>
 <property name="scanPeriod">5000</property> <!-- intervalo do scanner -->
 <property name="scanThreadName">HDScanner</property>
 </bean>
...

Para desabilitar o HDScanner basta renomear o descritor hdscanner-jboss-beans.xml para extensão .rej (ou remover o arquivo).

3) Outro importante serviço é o ServiceBindManager. Ele é responsável por configurar as portas de cada connector/invoker de acesso aos serviços/containers internos do JBoss.

Por exemplo o conector HTTP do JBossWEB atende por padrão na porta 8080, quando se deseja subir mais de uma instância num mesmo Host (JBoss em MultiHomed), temos duas alteranativas: (a) definir um endereço  IP para cada instância (run.sh -c default -b x.x.x.x) ou (b) usar o ServiceBindManager para trocar as portas automaticamente durante o startup do AS.

Para informar ao JBoss como ele irá atribuir as portas aos conectores basta informarmos um propriedade à JVM na linha de comanda que inicia o servidor:

./run.sh -c default -Djboss.service.binding.set=ports-01

Em destaque o parâmetro que informa aos ServiceBindManager quel o conjunto de portas será atribuído aos conectores de cada serviço. Neste exemplo (ports-01) irá atribuir a porta 8180 ao conector HTTP por exemplo.

Descritor do serviço: $JBOSS_HOME/server/default/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml

Trecho de conf:

<!-- Provides management tools with a ProfileService ManagementView
     interface to the SBM and its components -->
<constructor>
<!-- The name of the set of bindings to use for this server -->
<parameter>${jboss.service.binding.set:ports-default}</parameter>
<!--  The binding sets -->
<parameter>
<set>
   <inject bean="PortsDefaultBindings"/>
   <inject bean="Ports01Bindings"/>
   <inject bean="Ports02Bindings"/>
   <inject bean="Ports03Bindings"/>
</set>
</parameter>

<!-- Base binding metadata that is used to create bindings for each set -->
<parameter><inject bean="StandardBindings"/></parameter>
</constructor>
</bean>

Como podemos ver, o JBoss fornece 4 conjuntos de portas prontos para uso. Os parâmetros que devem ser informados na propriedade da linha de comando são os seguintes:

  • ports-default
  • ports-01
  • ports-02
  • ports-03

Basicamente o ServiceBindManager adiciona 100 ao número padrão de cada porta, ou seja, para a porta HTTP padrão (8080) quando usamos o conjunto ports-01 ela passará a ser 8180.

4) O serviço de LOG do JBoss continua sendo o Log4j. Nesse serviço geralmente temos a necesside alterar somente o nível (DEBUG,INFO,WARN,ERROR,FATAL) de saída do LOG geral do AS conforme a necessidade do ambiente. Na versão 5 do JBoss podemos informar esse nível de log via uma outra propriedade do sistema passada via linha de comando:

./run.sh -c default -Djboss.server.log.threshold=DEBUG

Neste caso informamos que o nível de log do servidor será DEBUG (geralmente utilizado em ambiente de desenvolvimento).

Outros ajustes do Log4j continuam sendo feitas no descritor do serviço tais como a configuração de appenders e category.

Descritor do serviço: $JBOSS_HOME/server/default/conf/jboss-log4j.xml

Por enquanto ficamos com esses pontos da configuração do JBoss AS. Posteriormente falarei sobre a configuração de classloaders isolados em aplicações WEB.

Abaixo algumas referências ([1] e [2]) sobre as principais mudanças no AS 5 descritas no wiki oficial do JBoss.ORG.

Abraço!

________

Ref.
[1] http://community.jboss.org/wiki/JBossAS50xChangesFAQ
[2] http://community.jboss.org/wiki/JBossAS5FAQ

Anúncios
Geral, JBoss

Erro java.lang.NoClassDefFoundError: sun.awt.X11GraphicsEnvironment

Depois de um longo tempo (tipo… quase 2 anos :-)) sem postar nada no blog, resolvi voltar a postar…

Neste post desejo compartilhar um “workaround” que encontrei na NET (depois de uma googlada básica) quando me deparei com um problema esquisito em uma aplicação web “deployada” no JBoss AS. Uma das funcionalidades dessa app faz a geração online de uns relatórios em PDF usando o JasperReports. As vezes a aplicação não consegue gerar o relatório e lança a seguinte exception no log do AS: java.lang.NoClassDefFoundError: sun.awt.X11GraphicsEnvironment. Encontrei algumas explicações na net (refs. [1] e [2]) que dizem, aparentemente, ser uma pala relacionada às bibliotecas gráficas em ambientes Linux/Unix. Segundo o trecho abaixo copiado da ref. [1] as bibliotecas AWT da Sun dependem do sistema de janelas X do Linux.

Sem aprofundar muito na questão de como a JVM abstrai isso do SO… O lance é que em ambientes de produção geralmente o ambiente gráfico do S.O (X11) está ausente. A ref. [1] sugere executar uma versão do X Server sem display (Xvfb), ou seja, o Xvfb executa as operações gráficas em memória. Após rodar o Xvfb deve-se configurar a var. de ambiente $DISPLAY do S.O apontando para esse daemond. Além dessa opção do Xvfb, ele sugere setar a JVM property "-Djava.awt.headless=true" que supostamente resolve o problema. Como a 1º opção é um pouco mais complicada preferi configurar a JVM Property mesmo. Em princípio o problema foi sanado, pelo menos, até o momento.

Caso queira saber masi sobre como usar o Xvfb em ambientes sem o X instalado veja a ref. [3] que mostra um cenário em que foi utilizado um Selenium para realização de testes em um servidor sem ambiente gráfico instalado.

_________
Referências:
[1] http://www.jguru.com/faq/view.jsp?EID=222296
[2] http://www.theserverside.com/discussions/thread.tss?thread_id=16049
[3] http://www.jeveaux.com/blog/2008/xvfb-como-usar-o-selenium-sem-ter-um-x-server/