Mostrando postagens com marcador jboss. Mostrar todas as postagens
Mostrando postagens com marcador jboss. Mostrar todas as postagens

terça-feira, 13 de setembro de 2016

Load balancer com WildFly 10

Esse passo a passo mostra como montar um ambiente com um Apache HTTP Server como loadbalancer e vários WildFly 10 atrás utilizando sempre o modo standalone.

Bom, trabalho com JBoss/WIldFly desde a versão 3 e já montei ambientes load balancer e cluster em mais de 20 ambientes... Esse mês montei novamente utilizando o WildFly 10 para um cliente que estou dando consultoria.

Antes de mais nada agradeço a todos do JBug Brasil. Sem a galera desse grupo eu não saberia nem iniciar o WildFly :) Entrem lá, recomendo!

O ambiente será assim:




Standalone ou domain?
Resolvi usar o modo standalone pois acredito que o modo domain adiciona um pouco mais de complexidade que não é necessária para ambientes com poucos servidores WildFly....

o domain serve apenas para centralizar as configurações em uma máquina só... caso queira fazer usando o modo domain, basta seguir esse tutorial e depois alterar para o modo domain....


Load balancer e/ou cluster

Aqui mostro apenas o como fazer um Load Balancer... não mostro como fazer um cluster... mas em muitos (talvez na maioria) dos ambientes, o cluster não é necessário....

O Load balancer serve para permitir escalabilidade... então atrás do Apache vai ter vários WildFly e você pode adicionar mais caso necessário (caso aumente o número de usuários por exemplo)

O Load balancer serve para redundância... se cair um WildFly, outro WildFly vai assumir....

"Tá Adriano, então pra que serve o cluster?"

O cluster serve para permitir o compartilhamento de dados de sessão.. por exemplo... no load balancer se vc estiver logado e de repente o WildFly cair, outro WildFly vai assumir, mas você voltará para a tela de login e terá q fazer login de novo... pois dados de sessão não são compartilhados no load balancer....

Para permitir que o usuário continue logado, você teria que ter um cluster...

Como os WildFly não vão cair o tempo inteiro... e se quando cair não for um problema tão grande o usuário ter q fazer login de novo... você não precisa de cluster....

Se você quiser fazer um cluster tudo bem.... não é muuuito dificil, é só seguir esse tutorial e depois alterar mais algumas coisinhas para implementar o cluster, mas não vou mostrar isso neste post...

Ahhh... E caso você esteja usando Amazon ou Digital Ocean... fazer um cluster vai ser um pouco mais difícil pois eles não permitem multicast (q é como as máquinas do cluster se comunicam) e você teria que fazer isso de outra forma... o q não é tããão simples...

Post passo-a-passo

Talvez (ou não) vc esteja se perguntando:
"Este passo-a-passo é completo e é só seguir que vai dar certo?"

Não! Esse passo-a-passo provavelmente não vai estar 100% claro e talvez falte algum detalhe... Foram anotações que fiz quando estava montando esse ambiente...

Não achei nenhum passo-a-passo mostrando como montar um load balancer com WildFly 10... por isso resolvi postar aqui mesmo que falte algum detalhe...

Até pq quando você for usar talvez vc use alguma versão diferente do que usei ou talvez seja diferente na sua infra ou no seu S.O.

Já montei load balancers e clusters em mais de 20 ambientes... e todas as vezes deu algum problema diferente...

"Tá Adriano, mas se não tá completo então esse post é inútil"

Acredito que é útil sim! talvez vc vai ter alguma dificuldade em algum ponto... aí vc abre um chamado no JBug Brasil e eu e outros caras que são bem legais vamos tentar te ajudar.


Vamos lá!


Você precisará de 3 máquinas:
- maq01: Apache HTTP Server
- maq02: WildFly Server1
- maq03: WildFly Server2

Sistema operacional
Sugiro o uso do sistema operacional RHEL (Red Hat Entrerprise Linux) ou CentOS (que é igual ao RHEL só que da comunidade).
Mas já implantei isso no Ubuntu também.
No Windows deve dar também... mas esse post vai ser todo focado em linux...


Em todas as máquinas faça esses passos:

- Configure a rede conforme desejado:
/etc/init.d/network stop
vi /etc/sysconfig/network-scripts/ifcfg-eth0
vi /etc/sysconfig/network
vi /etc/resolv.conf
/etc/init.d/network start

- Teste se a rede está OK
ping www.google.com
ifconfig


Maq01 - Apache HTTP Server

Documentação complementar:
https://docs.jboss.org/mod_cluster/1.1.0/html/native.config.html
https://httpd.apache.org/docs/2.4/howto/access.html

Apache 2.2
Aqui vou falar como implantar com o Apache 2.2... mais pra baixo comento como é com o Apache 2.4

yum install httpd httpd-devel apr-devel openssl-devel mod_ssl -y

sudo service httpd start


- Acesse no browser de sua máquina e verifique se o Apache HTTP Server está no ar, só acessar pelo ip: http://<ip da maquina>

- Baixe o mod_cluster (sempre utilize a versão mais atual ao invés de usar o comando abaixo, procure em http://mod-cluster.jboss.org/)
wget http://downloads.jboss.org/mod_cluster//1.3.1.Final/linux-x86_64/mod_cluster-1.3.1.Final-linux2-x64-so.tar.gz
tar -zxvf mod_cluster-1.3.1.Final-linux2-x64-so.tar.gz
cp mod_advertise.so /etc/httpd/modules/
cp mod_manager.so /etc/httpd/modules/
cp mod_proxy_cluster.so /etc/httpd/modules/
cp mod_cluster_slotmem.so /etc/httpd/modules/

- Comente a linha do mod_proxy_balancer pois será usado o mod_cluster
cd /etc/httpd/conf.modules.d
vi 00-proxy.conf

- A linha deve ficar assim:
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so


- Crie e adicione o conteúdo do arquivo mod_cluster.conf
cd /etc/httpd/conf.d/
touch mod_cluster.conf
vi mod_cluster.conf

LoadModule cluster_slotmem_module modules/mod_cluster_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule advertise_module modules/mod_advertise.so

MemManagerFile /var/cache/mod_cluster

Maxcontext 100
Maxnode 100
Maxhost 100

<VirtualHost *:80>

<Directory />
Order deny,allow
Allow from all
</Directory>

<Location /mod_cluster_manager>
SetHandler mod_cluster-manager
#Order deny,allow
#Deny from all
#Allow from all
AuthType Basic
AuthName "MCM"
AuthUserFile /etc/modclusterpassword
Require user admin
</Location>

KeepAliveTimeout 60
MaxKeepAliveRequests 0
ServerAdvertise Off
EnableMCPMReceive Off

</VirtualHost>



Apache 2.4
Essa semana instalei esse ambiente no Ubuntu e no Apache 2.4... teve algumas diferenças...

Para fazer isso (Apache 2.4 no Ubuntu) usei esse passo-a-passo:
https://symbiotics.co.za/configure-apache-with-mod_cluster-load-balancer-on-ubuntu/


Se acontecer o erro:

apache2: Syntax error on line 140 of /etc/apache2/apache2.conf:
Syntax error on line 3 of /etc/apache2/mods-enabled/proxy_cluster.load:
Cannot load /usr/lib/apache2/modules/mod_proxy_cluster.so into server:
/usr/lib/apache2/modules/mod_proxy_cluster.so: undefined symbol: ap_proxy_hashfunc



A solução é deixar o arquivo "proxy_cluster.load" dessa forma:

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule cluster_slotmem_module /usr/lib/apache2/modules/mod_cluster_slotmem.so
LoadModule manager_module /usr/lib/apache2/modules/mod_manager.so
LoadModule advertise_module /usr/lib/apache2/modules/mod_advertise.so
LoadModule proxy_cluster_module /usr/lib/apache2/modules/mod_proxy_cluster.so


Além disso, aconteceu o erro:

[Thu Aug 25 18:01:33.049309 2016] [proxy:warn] [pid 5911:tid [...] [client 177.101.142.200:58291] AH01144: No protocol handler was valid for the URL /systemprops. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

Ali onde estou carregando os módulos então tive que adicionar a seguinte linha:

LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so

Mais detalhes em: https://developer.jboss.org/thread/272092. Agradeço ao Ingo e filippe.spolti do JBug Brasil pela ajuda nesse problema.


Além disso, deu o erro:

2016-08-23 19:38:20,417 ERROR [org.jboss.modcluster] (UndertowEventHandlerAdapter - 1) MODCLUSTER000042: Error null sending INFO command to ip-<IP INTERNO DO APACHE>.sa-east-1.compute.internal/<IP INTERNO DO APACHE>:80, configuration will be reset: null


A solução... meu conf do apache estava assim:

<Directory />
     Order deny,allow
     Allow from all
</Directory>

Mas na versão Apache 2.4 tem que ser assim:

<Directory />
    AllowOverride none
    Require all granted
</Directory>

Mais detalhes em: https://developer.jboss.org/thread/272023



- Crie um usuário e senha
htpasswd -c /etc/modclusterpassword admin

- Reinicie o Apache:
sudo service httpd stop
sudo service httpd start

- Teste novamente no browser: http://<ip_da_maquina>

- Teste no browser o mod_cluster: http://<ip_da_maquina>/mod_cluster_manager




Maq02, Maq03

- Instale e configure o Java (Sempre use a versão mais atual)

Aqui está um exemplo de como instalar (no caso Java 7, mas use o 8), mas pode fazer como achar melhor.
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.rpm

rpm -Uvh jdk-7u79-linux-x64.rpm

alternatives --install /usr/bin/java java /usr/java/latest/jre/bin/java 200000
alternatives --install /usr/bin/javaws javaws /usr/java/latest/jre/bin/javaws 200000
alternatives --install /usr/bin/javac javac /usr/java/latest/bin/javac 200000
alternatives --install /usr/bin/jar jar /usr/java/latest/bin/jar 200000


- Instale o WildFly (Sempre baixe a versão mais atual):
Aqui está o 8, mas use o 10 ou superior:

wget http://download.jboss.org/wildfly/8.2.0.Final/wildfly-8.2.0.Final.zip

yum install unzip

unzip wildfly-8.2.0.Final.zip  -d /opt/
ln -s /opt/wildfly-8.2.0.Final /opt/wildfly


- Configure um usuário no linux:
groupadd wildfly
useradd -s /bin/bash -d /home/wildfly -m -g wildfly wildfly
chown -R wildfly:wildfly /opt/wildfly-8.2.0.Final
chown -h wildfly:wildfly /opt/wildfly

sudo vi /etc/sudoers
wildfly ALL=(ALL) NOPASSWD:ALL

passwd wildfly
su wildfly


- Inicie o WildFly rodando o standalone.sh da pasta bin passando como parâmetro o profile full-ha
./standalone.sh -server-config=standalone-full-ha.xml

- Veja no log se não deu erros
vi /opt/wildfly/standalone/log/server.log

- Pare o WildFly


- Adicione as linhas de JAVA_OPTS:
vi /opt/wildfly/bin/standalone.conf
JAVA_OPTS="$JAVA_OPTS -Djboss.bind.address=<IP MAQUINA>"

Ao invés de IP da máquina você pode usar 0.0.0.0 que é mais genérico



- Configure o mod_cluster no WildFly:
- acesse o arquivo standalone-full-ha.xml
- procure o subsystem modcluster e altere o conteúdo dele para:

<mod-cluster-config advertise-socket="modcluster" proxies="apache1" advertise="false" sticky-session="true" load-balancing-group="arquitetura" connector="ajp">
   <dynamic-load-provider>
     <load-metric type="cpu"/>
   </dynamic-load-provider>
</mod-cluster-config>


-dentro do seu socket-binding-group, você deve colocar isso:

<outbound-socket-binding name="apache1">
<remote-destination host="<IP INTERNO DO APACHE>" port="80"/>
</outbound-socket-binding>

Mais sobre isso: https://developer.jboss.org/thread/272022


- Inicie o WildFly
./standalone.sh -server-config=standalone-full-ha.xml


- Faça deploy de uma aplicação de testes
- Faça o deploy da aplicação systemprops jogando o war na pasta deployments do WildFly: https://dl.dropboxusercontent.com/u/8155843/TDC%20Floripa%202015/systemprops.war

Teste o load balancer
1) Acesse via broser a aplicação pelo apache http server: http://<ip_do_apache>/systemprops
2) A aplicação mostrará em qual host você vai estar: arquitetura-1 ou arquitetura-2. Vai depender de onde o loadbalancer te direcionou
3) Vá até a máquina que você foi direcionado (arquitetura-1 por exemplo) e pare o WildFly
4) Acesse a mesma URL e veja que você foi redirecionado para o arquitetura-2, ou seja, o loadbalancer está funcinando
5) Suba novamente o wildfly


Segurança
- Nunca inicie nada como root
- Não deixe acessível na web o servidor onde está o WildFly (configuração de infra). Resumindo, você não pode conseguir pingar o servidor onde está o WildFly, pois só o servidor do Apache deve estar disponível.
- Use SSL
- Permita o acesso ao mod cluster manager apenas na rede interna (melhor opção) ou apenas para um determinado IP. Algo como:
<Location /mod_cluster_manager>
SetHandler mod_cluster-manager
Order deny,allow
Deny from all
Allow from <seu_ip>
AuthType Basic
AuthName "MCM"
AuthUserFile /etc/modclusterpassword
Require user admin
</Location>

Mais sobre segurança em: https://developer.jboss.org/thread/258299


Perfomance
- Com Java 8 já vai aumentar muuuito a performance comparado com versões anteriores..
- o load balancer é bom para performance pois vai distribuir os acessos deixando tudo mais rápido...
- gzip compression no Apache é essencial
- Configure xms e xmx...
- faça testes de desempenho e utilize ferramentas de monitoramento: http://localhost8080.blogspot.com.br/2016/07/monitorar-ambiente-infra-e-jboss-wildfly.html
- Tuning: http://localhost8080.blogspot.com.br/2014/06/tunning-de-aplicacoes-java.html


Integração contínua
Use! :)


Consultoria:
Lembrando que se precisar dou consultorias nesse assunto e também em questões como performance, arquitetura, integração contínua, montagem de ambientes com load balancer e cluster, etc... Só entrar em contato: adriano@localhost8080.com.br


Abraço!
Adriano Schmidt

sábado, 16 de julho de 2016

Monitorar Ambiente/Infra e JBoss/WildFly

Segue uma lista de ferramentas e algumas observações para monitorar ambientes e também servidores de aplicação.

Já usei quase todas essas ferramentas e sempre estão surgindo novas. Fiz estas anotações rápidas para uma consultoria que dei e acredito que pode ser útil para outras pessoas.

Para monitorar o ambiente e JBoss/WildFly:

RHQ
- Para monitoar o JBoss/WildFly
- É da própria Red Hat
- Não é na nuvem, precisa de uma máquina pra ele
- É free
- Não é tão facil de instalar/configurar

Javamelody
- É free
- É fácil de instalar

Datadog
- Free até 5 hosts com 1 day retention
- $15 por host com 13 month retention

NewRelic
- $75USD/month per host


Para monitorar infra, máquinas e sistema operacional, pode-se usar umas dessas duas:
Nagios
Zabbix - Cada vez está sendo mais usado


Para centralizar logs de várias máquinas em um só lugar:

Logentries
- Send up to 5GB/month
- 7 day Retention

Log Stash
- Log stash is an open source tool for collecting, parsing, and storing logs for future use
- Kibana 3 is a web interface that can be used to search and view the logs that Logstash has indexed.
- Both of these tools are based on Elasticsearch.
- Elasticsearch, Logstash, and Kibana, when used together is known as an ELK stack.



Lembrando que se precisar dou consultorias nesse assunto e também em questões como performance, arquitetura, integração contínua, montagem de ambientes com load balancer e cluster, etc... Só entrar em contato: adriano@localhost8080.com.br


Agradeço ao Vinícius Fritzen que já utilizou várias destas ferramentas e me ajudou quando eu estava fazendo essa pesquisa.


Abraço!
Adriano Schmidt
adriano@localhost8080.com.br

sábado, 16 de maio de 2015

TDC Floripa - Palestra WildFly Avançado

Fala galera, ontem apresentei uma palestra sobre WildFly no TDC Floripa. Foi muito bacana, fiquei bem feliz com o resultado!

Assuntos abordados: Introdução; Novidades no WildFly 8; Por dentro; Apache HTTP Server; Cluster; Inimigos do cluster; Mãos na massa; Um pouquinho de tuning; WildFly 9; OpenShift;


O ambiente apresentado de load balancer e cluster está detalhado neste post: Como criar um Load Balancer e Cluster com WildFly 8

O ambiente de cluster local é mais simples e está esse post: Montando um cluster de WildFly em 5 minutos

Muito obrigado a todos do JBUG Brasil!

sexta-feira, 15 de maio de 2015

Como criar um Load Balancer e Cluster com WildFly 8

UPDATE: Fiz um novo tutorial para o WildFly 10: http://localhost8080.blogspot.com.br/2016/09/load-balancer-com-wildfly-10.html


Olá galera!

Esse post mostra como montar um ambiente com um Apache HTTP Server como loadbalancer e vários WildFly 8 em Cluster utilizando o modo domain para facilitar a gestão do ambiente.



Esse ambiente foi apresentado em uma palestra no TDC Floripa 2015. Para ver os slides: TDC Floripa - Palestra WildFly Avançado

Utilizei como base para montar esse ambiente os posts do Mauricio Magnani e ajuda do pessoal do JBUG Brasil.

Todas as máquinas utilizadas para montar esse ambiente utilizam CentOs 7. Você pode utilizar o S.O. que desejar, caso tenha alguma dificuldade é só entrar em contato.

Você precisará de 4 máquinas:
- maq01: Apache HTTP Server
- maq02: WildFly Master
- maq03: WildFly Server1
- maq04: WildFly Server2

Em todas as máquinas

- Configure a rede conforme desejado:
/etc/init.d/network stop
vi /etc/sysconfig/network-scripts/ifcfg-eth0
vi /etc/sysconfig/network
vi /etc/resolv.conf
/etc/init.d/network start

- Teste se a rede está OK
ping www.google.com
ifconfig

Maq01 - Apache HTTP Server
yum install httpd httpd-devel apr-devel openssl-devel mod_ssl -y

sudo service httpd start

- Acesse no browser de sua máquina se o Apache HTTP Server está no ar, só acessar pelo ip: http://<ip_da_maquina>

- Baixe o mod_cluster
wget http://downloads.jboss.org/mod_cluster//1.3.1.Final/linux-x86_64/mod_cluster-1.3.1.Final-linux2-x64-so.tar.gz
tar -zxvf mod_cluster-1.3.1.Final-linux2-x64-so.tar.gz
cp mod_advertise.so /etc/httpd/modules/
cp mod_manager.so /etc/httpd/modules/
cp mod_proxy_cluster.so /etc/httpd/modules/
cp mod_cluster_slotmem.so /etc/httpd/modules/

- Comente a linha do mod_proxy_balancer pois será usado o mod_cluster
cd /etc/httpd/conf.modules.d
vi 00-proxy.conf

- A linha deve ficar assim:
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so


- Crie e adicione o conteúdo do arquivo mod_cluster.conf
cd /etc/httpd/conf.d/
touch mod_cluster.conf
vi mod_cluster.conf

LoadModule cluster_slotmem_module modules/mod_cluster_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule advertise_module modules/mod_advertise.so

MemManagerFile /var/cache/mod_cluster

Maxcontext 100
Maxnode 100
Maxhost 100

<VirtualHost *:80>

<Directory />
Order deny,allow
Allow from all
</Directory>

<Location /mod_cluster_manager>
SetHandler mod_cluster-manager
#Order deny,allow
#Deny from all
#Allow from all
AuthType Basic
AuthName "MCM"
AuthUserFile /etc/modclusterpassword
Require user admin
</Location>

KeepAliveTimeout 60
MaxKeepAliveRequests 0
ServerAdvertise Off
EnableMCPMReceive Off

</VirtualHost>

- Crie um usuário e senha
htpasswd -c /etc/modclusterpassword admin

- Reinicie o Apache:
sudo service httpd stop
sudo service httpd start

- Teste novamente no browser: http://<ip_da_maquina>

- Teste no browser o mod_cluster: http://<ip_da_maquina>/mod_cluster_manager



Maq02, Maq03, Maq04

- Instale e configure o Java
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.rpm

rpm -Uvh jdk-7u79-linux-x64.rpm

alternatives --install /usr/bin/java java /usr/java/latest/jre/bin/java 200000
alternatives --install /usr/bin/javaws javaws /usr/java/latest/jre/bin/javaws 200000
alternatives --install /usr/bin/javac javac /usr/java/latest/bin/javac 200000
alternatives --install /usr/bin/jar jar /usr/java/latest/bin/jar 200000

- Instale o WildFly 8:
wget http://download.jboss.org/wildfly/8.2.0.Final/wildfly-8.2.0.Final.zip

yum install unzip

unzip wildfly-8.2.0.Final.zip  -d /opt/
ln -s /opt/wildfly-8.2.0.Final /opt/wildfly


- Configure um usuário no linux:
groupadd wildfly
useradd -s /bin/bash -d /home/wildfly -m -g wildfly wildfly
chown -R wildfly:wildfly /opt/wildfly-8.2.0.Final
chown -h wildfly:wildfly /opt/wildfly

sudo vi /etc/sudoers
wildfly ALL=(ALL) NOPASSWD:ALL

passwd wildfly
su wildfly

- Configure o WildFly
cd /etc/default
vi wildfly.conf
descomentar JBOSS_USER

- Inicie o WildFly
sudo service wildfly start

- Veja no log se não deu erros
vi /opt/wildfly/standalone/log/server.log

- Pare o WildFly
sudo service wildfly stop


Maq02 - WildFly Master

- Configure o WildFly
sudo vi /etc/default/wildfly.conf

JBOSS_MODE=domain
JBOSS_DOMAIN_CONFIG=domain.xml
JBOSS_HOST_CONFIG=host-master.xml
STARTUP_WAIT=30
SHUTDOWN_WAIT=30
JBOSS_CONSOLE_LOG=/var/log/wildfly/console.log

- Faça login com o usuário wildlfy
su wildfly

- Adicione a linha para setar o parametro jboss.bind.address.management, adicione junto com as outras linhas de JAVA_OPTS
vi /opt/wildfly/bin/domain.conf
JAVA_OPTS="$JAVA_OPTS -Djboss.bind.address.management=<IP_DA_MAQUINA>"

- Configure o domain.xml
vi /opt/wildfly/domain/configuration/domain.xml

de:
 <server-groups>
[...]
 </server-groups>

para:
<server-groups>
   <server-group name="arquitetura-grupo-1" profile="full-ha">
    <jvm name="default">
      <heap size="512m" max-size="512m"/>
      <permgen max-size="256m"/>
    </jvm>
    <socket-binding-group ref="full-ha-sockets"/>
   </server-group>
</server-groups>

- Crie um usuário dentro do WildFly para comunicação no modo domain, usaremos mais para frente
sh /opt/wildfly/bin/add-user.sh
[enter]
wuser
mortadela@1
mortadela@1
[enter]
yes
yes

- Anote o secret gerado após criar o usuáro pois usaremos adiante:
 <secret value="bW9ydGFkZWxhQDE=" />

- Crie um usuário para acessar o webconsole
sh /opt/wildfly/bin/add-user.sh
[enter]
domainadmin
mortadela@1
mortadela@1
[enter]
yes
no


Maq03 e Maq04

- Configure o WildFly:
sudo vi /etc/default/wildfly.conf

JBOSS_USER=wildfly
JBOSS_MODE=domain
JBOSS_HOST_CONFIG=host-slave.xml
STARTUP_WAIT=30
SHUTDOWN_WAIT=30
JBOSS_CONSOLE_LOG=/var/log/wildfly/console.log


- Adicione as linhas de JAVA_OPTS:
vi /opt/wildfly/bin/domain.conf

JAVA_OPTS="$JAVA_OPTS -Djboss.domain.master.address=<IP MASTER>"
JAVA_OPTS="$JAVA_OPTS -Djboss.bind.address=<IP MAQUINA>"

- Configure o slave:
vi /opt/wildfly/domain/configuration/host-slave.xml

- adicione name no <host (na maq03 adicione host1, na maq04 adicione host2)
<host name="server-host1-widfly"

- altere o <secret> para o secret gerado no master

- Adicione o username:
<domain-controller>
   <remote host="${jboss.domain.master.address}" username="wuser" port="${jboss.domain.master.port:9999}" security-realm="ManagementRealm"/>
</domain-controller>

- Altere o servers para: (na maq03 adicione arquitetura-1, na maq04 adicione arquitetura-2)
<servers>
   <server name="arquitetura-1" group="arquitetura-grupo-1"/>
</servers>


Maq02, Maq03, Maq04

- Inicie o WildFly
sudo service wildfly start

Maq02
- Faça deploy de uma aplicação de testes
1) Entre via browser no console admin do WildFly master: http://<ip_wildfly_master>:9990/
2) Digite usuário domainadmin e a senha mortadela@1
3) Acesse a parte de deployments
4) Faça o deploy da aplicação systemprops: https://dl.dropboxusercontent.com/u/8155843/TDC%20Floripa%202015/systemprops.war
5) Clique em Assign e associe ao grupo grupo-arquitetura-1

- Teste o load balancer
1) Acesse via broser a aplicação pelo apache http server: http://<ip_do_apache>/systemprops
2) A aplicação mostrará em qual host você vai estar: arquitetura-1 ou arquitetura-2. Vai depender de onde o loadbalancer te direcionou
3) Vá até a máquina que você foi direcionado (arquitetura-1 por exemplo) e pare o WildFly: sudo service wildfly stop
4) Acesse a mesma URL e veja que você foi redirecionado para o arquitetura-2, ou seja, o loadbalancer está funcinando
5) Suba novamente o wildfly: sudo service wildfly start

- Teste o cluster:
1) Faça deploy da aplicação de teste do cluster: https://dl.dropboxusercontent.com/u/8155843/TDC%20Floripa%202015/cluster-example.war
2) Acesse http://<ip_do_apache>/cluster
3) Veja uma contagem acontecendo, esse valor está num EJB Stateful
4) Pare um wildfly
5) A contagem deve continuar
6) Suba a máquina que parou e pare a outra
7) A contagem deve continuar, ou seja, o cluster está funcionando.

Mais detalhes:
- Esse tutorial foi baseado neste:
https://jbossdivers.wordpress.com/2014/03/23/configurando-um-ambiente-wildfly-8-profissional/
https://jbossdivers.wordpress.com/2014/03/23/configurando-um-ambiente-wildfly-8-profissional-parte-2/

- Para mais informações sobre mod_cluster
http://mod-cluster.jboss.org/

- Dúvidas podem ser tiradas no JBUG Brasil:
https://developer.jboss.org/groups/jbug-brasil

Vaaaaleu!!
Adriano Schmidt

sexta-feira, 16 de janeiro de 2015

Minha experiência com Openshift

Olá pessoal...

Hospedei uma aplicação minha no Openshift e tive algumas dificuldades que quero compartilhar com vocês.





No primeiro dia que fui usar a aplicação ela caia do nada e eu precisa dar um "rhc force stop" entre outras coisas para ela voltar a funcionar... Mas isso foi azar meu... pois exatamente neste dia, no dia que eu comecei a usar o Openshift estavam acontecendo alguns problemas de segurança no Openshift e deu problema para todos os usuários do mundo... a própria Red Hat abriu um chamado informando isso... mas nos dias seguintes não aconteceu mais nada sem explicação desse jeito.


O que eu percebia é que eu acessava minha aplicação e ela estava no ar... dois dias depois eu acessava novamente e ela estava fora do ar... acessava 5 minutos depois e ela estava no ar novamente. Isso acontece pois no plano free sua aplicação fica inativa (idle) após 24 horas sem acessos.
Agora eu acesso a aplicação todos os dias e isso evita que ela caia... No futuro penso em talvez fazer algum job que faz isso automaticamente pra mim (não sei se é ilegal fazer isso, mas caso meu cliente vá usar a aplicação ela deve estar no ar, caso contrário ele vai ficar chateado comigo)


O certo para não precisar fazer essa gambiarra de ter um job acessando todos os dias a aplicação seria migrar do plano free para o plano bronze ou silver.
Maaaas esse planos não estão disponíveis no Brasil, apenas em:
- North America (U.S. and Canada)
- Europe (EU member states, Iceland, Israel, Norway, Switzerland, and Russia)
Fonte: https://www.openshift.com/products/pricing#regional_availability

Quem quiser pode responder esse formulário pedindo para colocarem no Brasil também:
https://www.openshift.com/page/geo-request-form

Porém, conforme informado pela Red Hat em um chamado que abri, se você tiver um cartão de crédito com endereço de cobrança em um destes países acima poderá contratar os planos bronze ou silver.

Tive dificuldades para usar naked domain, ou seja, permitir que meu site fosse acessado por meudominio.com.br e não só por www.meudominio.com.br (veja que um tem o www e o outro não)
O problema é que no openshift eu não tenho um IP, então não consigo adicinar no meu provedor DNS um registro do tipo A, tem que ser do tipo CNAME, mas no provedor DNS do registro.br que é o que eu usava não é possível adicionar um CNAME sendo naked domain... Utilizando o www.cloudflare.com como DNS Provider deu certo, pois ele permite adicionar naked domaind para CNAME.

Mas agora minha aplicação está no ar, estou conseguindo fazer tudo que preciso (deploy, configurar domínio/DNS, configurações), por enquanto vou seguir usando o Openshift, está atendendo minhas necessidades, mas como o plano free é um pouco limitado, se minha aplicação chegar a ter muitos usuários vou ter que conseguir um cartão de crédito de algum amigo que mora no exterior ou terei que buscar outra alternativa.


Caso sua aplicação rode com JBoss ou Wildfly e você queira dar uma olhada em outras alternativas para hospedar sua aplicação você pode verificar na Amazon, Digital Ocean ou Integrator.


E você? Qual sua experiência com Openshift? Fique à vontade para deixar comentários sobre o openshift ou sugerir outros serviços de hospedagem ou alguma dúvida.


Abraço!!!
Adriano Schmidt

quinta-feira, 7 de agosto de 2014

Change JBoss Locale

Versão em português

Hello,

Today I had problems with numeric fields and dates. I typed 20,00 and was displayed 2000. I also had problems with the display of dates.

The problem didn't happen in de development machines, just in homologation machines, because the default locale was different in this environments.

In your eclipse:
- Go to in "Server
- Double-click at JBoss
- Click in "Open Launch Configuration"
- Type at the end of "VM Arguments" field: -Duser.language=pt -Duser.country=BR

But to start JBoss with command line, it doesn't work:
standalone.bat -Duser.language=pt -Duser.country=BR

You need to change the configuration files.

In Windows environments, you must add the following line in the file standalone.conf.bat
set "JAVA_OPTS=%JAVA_OPTS% -Duser.language=pt -Duser.country=BR"

In Linux environments, you must add the following line in the file standalone.conf
JAVA_OPTS="$JAVA_OPTS -Duser.language=pt -Duser.country=BR"

Best Regards!
Adriano Schmidt

PS: My English isn't very good, if you see something wrong please let me know.

Mudar Locale do JBoss

English version

Olá,

Hoje tive problemas com campos numéricos e com datas. Eu digitava 20,00 e ele virava 2000 e outras loucuras assim pois trocava vírgula com ponto e vice-versa, também alguns campos de data estavam aparecendo Feb, 08, 2014 e não 08/02/2014.

Nas máquinas dos desenvolvedores não acontecia isto, porém, no ambiente de homologação acontecia. Os desenvolvedores tinham máquina cujo Locale default era pt_BR (português do Brasil) já no servidor era en_US (inglês dos Estados Unidos).

O ideal é você tratar isso na sua aplicação, porém, pode ser resolvido mudando o locale do JBoss.

No eclipse é só você ir na aba servers, dar dois cliques no seu JBoss, clicar em "Open Launch Configuration" e adicionar os seguintes parâmetros em VM Arguments:
-Duser.language=pt -Duser.country=BR

Já quando você for iniciar via linha de comando NÃO pode simplesmente adicionar dessa forma:
standalone.bat -Duser.language=pt -Duser.country=BR

Dessa forma não funciona, é preciso alterar os arquivos de configuração:

Em ambiente windows precisa alterar o arquivo standalone.conf.bat adicionando a linha abaixo após as outras linhas semelhantes a ela:
set "JAVA_OPTS=%JAVA_OPTS% -Duser.language=pt -Duser.country=BR"

Em ambiente linux precisa alterar o arquivo standalone.conf adicionando a linha abaixo ao final do arquivo:
JAVA_OPTS="$JAVA_OPTS -Duser.language=pt -Duser.country=BR"

Abraço!
Adriano Schmidt

terça-feira, 17 de junho de 2014

Seminário JBoss/WildFly - Avançado

Nesse sábado (14/06/2014) aconteceu o primeiro Supero TechDay!

Estou muitíssimo feliz pelo evento! Todo mundo muito empolgado trocando conhecimentos e experiências.

Valeu muito à pena! Estou muito orgulhoso e feliz por trabalhar na Supero TI (www.supero.com.br) e muito satisfeito por estar numa equipe com tanta gente bacana!

Neste evento fiz uma apresentação onde explanei sobre o JBoss e sua mais nova versão o WildFly. Abordei a história, arquitetura, funcionamento e dicas sobre o JBoss/WildFly e mostrei em funcionamento um ambiente com um Apache HTTP Server como load balancer e proxy reverso com vários JBoss em cluster.



Não poderia deixar de agradecer ao JBUG Brasil e todos os seus membros, especialmente ao Maurício Magnani (https://jbossdivers.wordpress.com/), que me ajudaram muito a ter o conhecimento que tenho hoje sobre JBoss.

quarta-feira, 16 de abril de 2014

show_sql=true não exibe os parâmetros

Após setar o show-sql como true no meu persistence.xml no meu projeto que roda no JBoss EAP 6.2 (ou Jboss AS7, ou WildFly) as queries apareceram no log, mas o valor dos parâmetros não. Aparecia somente assim:

21:10:03,314 INFO  [stdout] (http-/0.0.0.0:8080-3) Hibernate: select exemplo0_.COL_X from EXEMPLO exemplo0_ where exemplo0_.COL_Y =?

Para fazer os valores aparecerem entrei no arquivo standalone.xml do meu JBoss e fui no subsystem logging (esse arquivo tem várias tags subsystem, uma delas tem o name logging)

Então, junto com os outros loggers adicionei o logger abaixo:

<logger category="org.hibernate.type.descriptor.sql.BasicBinder">
     <level name="TRACE"/>
</logger>

Após reiniciar o JBoss, o log ficou assim:

21:15:04,234 INFO  [stdout] (http-/0.0.0.0:8080-3) Hibernate: select exemplo0_.COL_X from EXEMPLO exemplo0_ where exemplo0_.COL_Y =?
21:15:04,234 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] (http-/0.0.0.0:8080-3) binding parameter [1] as [BIGINT] - 600

Fonte: http://stackoverflow.com/questions/9159752/how-to-get-jdbc-binding-parameters-from-hibernate-in-jboss-7

quarta-feira, 12 de março de 2014

JBoss x Tomcat

Por que usar JBoss ao invés de Tomcat?

Primeiramente é bom explicar que o Tomcat é um Web Container (contém engines para Servlet e JSP), já o JBoss é um Application Server (container para a plataforma JEE, contém um Web Container, porém tem um EJB container e outras engines).

Para aplicações simples você consegue utilizar um Web Container, para aplicações com mais tecnologias (EJB por exemplo), você até consegue usar um Web Container, porém, terá que adicionar muitas bibliotecas e configurações nele. Em um Application Server tudo é nativo.

Em 2010 por exemplo, fazia muito sentido utilizar apenas um Web Container para uma aplicação simples pois os Application Servers eram muito pesados, consumiam muitos recursos computacionais, demoravam para iniciar e eram difíceis de manter, porém os Application Servers em 2014 não tem mais estes problemas. A própria Apache, criadora do Tomcat, criou seu próprio Application Server chamado TomEE para ser usado no lugar do Tomcat. (http://tomee.apache.org/apache-tomee.html)

Os Application Servers trabalham com profiles, que define o que será carregado, o profile mais leve dos Application Servers é como um Web Container, por isso, não existe mais a necessidade de se trabalhar com Tomcat em projetos novos, a não ser que você queira manter padrão com outras aplicações da empresa ou algo assim, porém, essa decisão traria muitas outras dificuldades para o desenvolvimento e controle da infraestrutura de uma aplicação JEE.

Abraços!
Adriano Schmidt

sexta-feira, 31 de janeiro de 2014

JBoss JAAS LDAP Tutorial

Pessoal.. tive que configurar um ambiente JBoss EAP6/AS7 + JAAS + LDAP/AD e apanhei bastante pra conseguir, então resolvi fazer um artigo aqui no blog em formato de tutorial pra documentar o passo-a-passo e ajudar quem tiver que fazer o mesmo.

Primeiro eu segui um tutorial e não deu certo: http://middlewaremagic.com/jboss/?p=378

Não sei o motivo ainda, mas não foi de jeito nenhum.

Depois segui o tutorial do Mauricio Magnani e deu tudo certo! http://jbossdivers.wordpress.com/2012/02/12/utilizando-ldap-login-module-no-jboss-as-7-1/

No tutorial do Mauricio ele usou o openldap no linux, eu utilizei o Apache Directory Studio no Windows (tem pra linux e mac também) para criar meu servidor de LDAP/AD. Esse software é baseado no eclipse e falicita muito o trabalho com LDAP/AD, permite criar servidores, criar usuários, adicionar atributos, tudo pela interface gráfica. É lindo : ) Muito fácil de usar!

Na sua empresa/cliente talvez você já tenha um servidor de LDAP/AD, então você teria que usar ele, mas sugiro criar o server na sua máquina para testar, e depois que estiver tudo funcionando, é só apontar para o LDAP/AD da sua empresa/cliente.

* Instale o Apache Directory Studio
Baixe o Apache Directory Studio, instale, e inicie ele.
http://directory.apache.org/studio/downloads.html

* Crie Server LDAP local
Entre na aba "LDAP Servers" (Caso ela não aparece: Window > Show View > LDAP Servers)
Botão direito > New > New Server
Escolha "ApacheDS 2.0.0
Clique em "Finish"
Inicie o servidor

* Conecte-se no server criado
Entre na aba "Connections"
Botão direito > New Connection
Em "Connection Name" coloque "localhost"
Em "Hostname" coloque "localhost"
Em "Port" coloque "10389"
Clique em next
Em "Bind DN ou user" coloque "uid=admin,ou=system"
Em "Bind password" coloque "secret"
Clique em "Check Authentication", tem que funcionar : )
Clique em "Finish"

*Crie um usuário
Entre na aba "LDAP Browser"
DIT > Root DSE > ou=system" > ou=users
Botão direito em "ou=users" > New > New Entry
Clique em "Create entry from strach"
Clique em "Next"
Em "Available object classes" escolha "inetOrgPerson"
Clique em "Next"
Em "RDN", no primeiro campo, coloque "uid"
Em "RDN", no segundo campo, coloque "user1"
Clique em "Next"
Em "cn" coloque "user1"
Em "sn" coloque "user1"
Botão direito > New Attribute
Em "Attribute type" coloque "userPassword"
Clique em "Finish"
Em "Enter New Password" coloque "secret"
Clique em "OK"
Clique em "Finish"

* Crie uma role
Entre na aba "LDAP Browser"
DIT > Root DSE > ou=system" > ou=groups
Botão direito em "ou=groups" > New > New Entry
Clique em "Create entry from strach"
Clique em "Next"
Em "Available object classes" escolha "groupOfNames"
Clique em "Next"
Em "RDN", no primeiro campo, coloque "cn"
Em "RDN", no segundo campo, coloque "General"
Clique em "Next"
No campo que vai aparecer coloque "uid=user1,ou=users,ou=system"
Clique em "OK"
Clique em "Finish"



* Instale o JBoss AS 7.1.1 ou o JBoss EAP 6.2 (Testei nestas duas versões e funcionou, nas demais versão do AS7 e EAP6 deve funcionar também)
Basta baixar o zip e descompactar
A JDK precisa estar configurada no JAVA_HOME e isso precisa estar no PATH
Rode o standalone.bat ou o standalone.sh do JBoss para verificar se está funcionando.

* Configure o standalone.xml
No subsystem de security adicione as seguintes linhas dentro da tag <security-domains>

<security-domain name="ldap_security_domain">
    <authentication>
        <login-module code="LdapExtended" flag="required">
            <!-- Nao alterar -->
            <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>

            <!-- Deve ser colocado o IP e porta do LDAP -->
            <module-option name="java.naming.provider.url" value="ldap://localhost:10389"/>

            <!-- Nao alterar -->
            <module-option name="java.naming.security.authentication" value="simple"/>

            <!-- Deve ser colocado o usuário admin e senha -->
            <module-option name="bindDN" value="uid=admin,ou=system"/>
            <module-option name="bindCredential" value="secret"/>

            <!-- Deve ser colocado o diretorio onde estarao os usuarios -->
            <module-option name="baseCtxDN" value="ou=system"/>

            <!-- Deve ser colocado o atributo que representa o login do usuario -->
            <module-option name="baseFilter" value="(uid={0})"/>

            <!-- Deve ser colocado o diretorio onde estara o grupo com todos os usuarios -->
            <module-option name="rolesCtxDN" value="ou=groups,ou=system"/>

            <!-- Deve ser colocado o atributo do grupo que indica quais usuarios pertencem ao grupo -->
            <module-option name="roleFilter" value="(member={1})"/>

            <!-- Nao alterar -->
            <module-option name="roleAttributeID" value="cn"/>
            <module-option name="roleRecursion" value="-1"/>
            <module-option name="throwValidateError" value="true"/>
            <module-option name="searchScope" value="ONELEVEL_SCOPE"/>
        </login-module>
    </authentication>
</security-domain>


No subsystem de logging adicione as seguintes linhas junto com os demais loggers:

<logger category="org.jboss.security">
  <level name="TRACE"/>
</logger>

Isso serve para sair mais logs no server.log para ajudar a identificar problemas, depois que estiver tudo funcionando, altere de TRACE para WARN.

* Configure o seu projeto
No seu projeto em src/main/webapp/WEB-INF crie um arquivo chamado jboss-web.xml com o seguinte conteúdo:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
    <security-domain>java:/jaas/ldap_security_domain</security-domain>
</jboss-web>


No seu projeto em src/main/webapp/WEB-INF crie um arquivo chamado web.xml com o seguinte conteúdo:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 <display-name>NomeDoProjeto</display-name>

 <!-- JSF -->
 <servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>*.jsf</url-pattern>
 </servlet-mapping>
 <welcome-file-list>
  <welcome-file>index.jsf</welcome-file>
 </welcome-file-list>

 <!-- Security -->
 <!-- Aqui voce mexe para dar permissoes para diferentes pastas para roles diferentes -->
 <!-- Nesse exemplo eu permito que apenas usuario da role "General" possam acessar /protected/* -->
 <security-constraint>
  <web-resource-collection>
   <web-resource-name>Protected</web-resource-name>
   <url-pattern>/protected/*</url-pattern>
   <http-method>GET</http-method>
   <http-method>POST</http-method>
  </web-resource-collection>
  <auth-constraint>
   <role-name>General</role-name>
  </auth-constraint>
 </security-constraint>

 <login-config>
  <auth-method>FORM</auth-method>
  <realm-name>LDAP</realm-name>
  <form-login-config>
   <form-login-page>/Login.jsf</form-login-page>
   <form-error-page>/Login.jsf?invalidLogin=true</form-error-page>
  </form-login-config>
 </login-config>

 <security-role>
  <role-name>General</role-name>
 </security-role>

</web-app>


No seu projeto em src/main/webapp crie um arquivo chamado index.xhtml com o seguinte conteúdo:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">

 <h:body>
  <h:outputText value="Ola mundo" />
 </h:body>
</html>


No seu projeto em src/main/webapp crie um arquivo chamado Login.xhtml com o seguinte conteúdo:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">

<h:body>
 <form id="formLogin" action="j_security_check" method="post">

  <h:outputText value="LOGIN"/>

  <br/><br/>

  <h:panelGroup rendered="#{param['invalidLogin'] == 'true'}">
   <h:outputText value="Por favor utilize credenciais autorizadas." />
   <br/><br/>
  </h:panelGroup>

  <h:outputText value="Usuario: "/>
  <h:inputText id="j_username" required="true" />

  <br/><br/>
  
  <h:outputText value="Senha: "/>
  <h:inputSecret id="j_password" feedback="false" required="true"/>

  <br/><br/>

  <h:commandButton id="access_button" type="submit" value="Entrar"/>
 </form>
</h:body>
</html>


No seu projeto em src/main/webapp crie uma pasta chamada protected.
No seu projeto em src/main/webapp/protected crie um arquivo chamado ProtectedFile.xhtml com o seguinte conteúdo:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">

 <h:body>
  <h:outputText value="Arquivo protegido." />
 </h:body>
</html>

* Teste
Reinicie o JBoss e faça deploy da sua aplicação.

Acesse http://localhost:8080/nomeDoProjeto/index.jsf e você vai conseguir acessar normalmente.
Acesse http://localhost:8080/nomeDoProjeto/protected/ProtectedFile.jsf e você vai ser redirecionado para a tela Login.jsf
Entre com o usuário user1 com a senha secret e você vai ser direcionado para tela ProtectedFile.jsf


Pronto :D
Funciona que é uma beleza!!
E mais uma vez quero agradecer ao Mauricio Magnani pelo seu blog http://jbossdivers.wordpress.com/ que me ajudou nessa atividade.

Abraços!!
Adriano Schmidt

quinta-feira, 30 de janeiro de 2014

LDAP - Failed to parse: null, disabling recursion: java.lang.NumberFormatException: null

Configurando um Ambiente JBoss 7.1.1-Final com JAAS e LDAP/AD eu tive o erro abaixo:

14:46:42,273 TRACE [org.jboss.security.auth.spi.LdapExtLoginModule] (http-localhost-127.0.0.1-8080-1) Failed to parse: null, disabling recursion: java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:454) [rt.jar:1.7.0_51]
at java.lang.Integer.parseInt(Integer.java:527) [rt.jar:1.7.0_51]
at org.jboss.security.auth.spi.LdapExtLoginModule.createLdapInitContext(LdapExtLoginModule.java:395) [picketbox-4.0.7.Final.jar:4.0.7.Final]
[...]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51]

Para resolver, bastou adicionar a linha abaixo no login-module do subsystem security no standalone.xml

<module-option name="roleRecursion" value="-1"/>

Isso resolveu o problema!!!

Abraços!!
Adriano Schmidt

segunda-feira, 25 de novembro de 2013

Tuning EJB Pool JBoss 7

Pessoal..

Hoje eu tive o erro: "JBAS014516: Falha ao adquirir uma permissão com 5 MINUTES".

Isso aconteceu pois estourou o pool de EJBs..

Basicamente ele funciona assim... tem 20 instâncias no pool..

Cada vez que uma pessoa está usando o sistema e aperta em um botão ou entra em uma tela que chama um serviço EJB, uma instância é tirada do pool..

Se 20 pessoas fizerem isso ao mesmo tempo, acessando o mesmo serviço, as 20 instâncias estarão ocupadas, então se uma 21ª pessoa precisar chamar o serviço EJB, ela vai ter que esperar alguma instância parar de ser utilizada e voltar ao pool... se isso levar mais de 5 minutos, acontece o erro do log: "JBAS014516: Falha ao adquirir uma permissão com 5 MINUTES".

Se tiver 50 pessoas acessando ao mesmo tempo, a 50ª terá que esperar 30 instâncias serem liberadas.

Esse valor de 20 instâncias e o tempo de timeout são configuráveis.

No caso de um sistema, ou de um jboss que tenha vários sistemas, que tenha muitos usuários simultâneos é interessante aumentar o pool de EJBs.

Para saber o melhor valor existem três alternativas:
1) Deve ser feito monitoramento do pool através do JBoss CLI ou de algum profiler que tenha essa funcionalidade
2) Testes de desempenho com JMeter (ou outra ferramenta) e avaliar o desempenho da aplicação com diferentes valores de pool.
3) Seguir o feeling e aumentar de 20 para 30 ou 40 e ir sentindo como a aplicação se comporta com o tempo.

Para alterar os valores do pool você pode fazer isso:
- Direto no standalone.xml ou domain.xml
- No Web Console
- Via JBoss CLI

Infelizmente apenas conseguimos definir o pool para o subsystem inteiro, não conseguimos definir por aplicação ou até mesmo por Serviço EJB.

Existem 3 pool que podem ser alterados:
- slsb-strict-max-pool > é utilizado pelos stateless service bean (foi esse que causou meu erro)
- mdb-strict-max-pool > MDB, utilizado por serviços JMS
- thread-pools > é usado pelo EJB Timer, pelo Asynchronous EJB e para fazer chamadas de EJB remotos.. Caso você use estas funcionalidades e sinta necessidade, esse pool pode ser alterado também. Nesse caso você pode até criar pools separados pois estas 3 funcionalidades compartilham o mesmo pool.

Mais detalhes sobre o subsystem EJB: https://docs.jboss.org/author/display/AS71/EJB3+subsystem+configuration+guide

É isso aí : ) abraço!
Adriano Schmidt

terça-feira, 2 de julho de 2013

JBoss AS 7 - Cluster SSO

Oi pessoal : )

Eu montei um ambiente com vários JBoss AS 7 em cluster, a replicação de sessão estava funcionando perfeitamente, porém, o user principal (usuário logado) não estava replicando para os outros nós do cluster.

Achei na documentação que para isso funcionar precisavam ser feitas mais alguns ajustes:

https://access.redhat.com/site/documentation/en-US/JBoss_Enterprise_Application_Platform/6.1/html/Development_Guide/Use_Single_Sign_On_SSO_In_A_Web_Application.html

mas seguindo a documentação não funcionou :(

os pré-requisitos são os mesmos.. existem apenas duas coisas erradas na documentação:

1) cache-container="web"
O script abaixo está errado:
/profile=ha/subsystem=web/virtual-server=default-host/sso=configuration:add(cache-container="web",cache-name="sso",reauthenticate="false",domain="domain.com")

o correto é:
/profile=ha/subsystem=web/virtual-server=default-host/sso=configuration:add(cache-container="web")

(Lembrando que você deve alterar o nome do perfil para o perfil que você está utilizando, e caso você esteja no standalone deve retirar o /profile=ha do comando)

2) Valve
Você não deve adicionar nenhum valve no seu jboss-web.xml pois a classe ClusteredSingleSignOn é instanciada automaticamente.

Pronto! Funcionou perfeitamente!

Fonte: https://community.jboss.org/message/825375#825375

Abraços!
Adriano Schmidt

sábado, 22 de junho de 2013

JSF 2.2

E aí pessoal..

Hoje estava em um cliente que tem uma aplicação com JSF 2.1 e EJB 3.1 rodando no JBoss AS 7.

Essa aplicação tem centenas de acessos simultâneos e estávamos com problemas de uso de memória e de performance.

Sei que JSF talvez não seja a tecnologia mais adequada para projetos como esse, mas não poderíamos mudar isso agora.

Nós migramos a aplicação de JSF 2.1 para JSF 2.2 e tivemos muitos ganhos! O consumo de memória diminuiu consideravelmente! O GC conseguiu rodar melhor e limpar o heap bem mais do que fazia no JSF 2.1! Não sei se foi apenas por consequência do melhor uso da memória, mas a performance aumentou muito também!

Tudo isso foi constatado pelos próprios usuários e também por testes com o JMeter e com análises utilizando o VisualVM.

Enfim, fica a dica pessoal, usem o JSF 2.2!

Para implantar ele no JBoss AS 7 foi bem tranquilo! Nós seguimos este tutorial: http://www.marcusschiesser.de/2013/01/how-to-use-jsf-2-2-with-jboss-7-1/

Só um porém.. alguns componentes na aplicação tinham update="@form" ou update="idDeUmForm" e isso parou de funcionar no JSF 2.2 :/

Não sei o motivo.. aqui eram poucos casos e resolvemos alterando o update para atualizar o componente que devia ser atualizado e não todo o form.

Ao invés de update="@form" usamos update="idDoComponenteDentroDoFormQueTinhaQueSerAtualizado" : )

Abraços!!
Adriano Schmidt

sábado, 18 de maio de 2013

Certificação RHCJA - JBoss EAP 6

Olá pessoal!!

O Maurício Magnani (http://jbossdivers.wordpress.com/) está fazendo uma série de vídeo-aulas explicando tudo que cai na certificação RHCJA, eu estou assistindo todos os vídeos e fazendo um resumo de cada um para facilitar meus estudos.

Estou compartilhando aqui todas as minhas anotações de forma estruturada e de fácil entendimento para ajudar a todos que também queiram realizar esta certificação.

Recomendo assistirem todos os vídeos e depois estudarem por estes resumos para relembrar tudo o que foi visto.

Vamos lá!!

1) Introdução


https://community.jboss.org/wiki/RedHatCertifiedJBossAdministrator-JBossEAP6-Parte1

  • Explicações sobre a prova
    • A prova é totalmente prática
    • Dura 4 horas
    • A única consulta que você pode fazer é a documentação do JBoss EAP. Saiba utilizá-la!
    • Você irá trabalhar em um sistema operacional Red Hat Enterprise Linux® 6 durante o exame
    • É importante ter um conhecimento básico de linux
    • A prova abordará assuntos de diversos módulos, para cada módulo o Maurício fez um vídeo explicando tudo o que você precisa saber.
    • A prova tem o valor aproximado de 400 dólares e, no Brasil, só pode ser feita em São Paulo.

2) Instalar o JBoss EAP em um local específico do sistema


https://community.jboss.org/wiki/RedHatCertifiedJBossAdministrator-JBossEAP6-Parte2

  • Basta pegar o pacote do JBoss EAP (o arquivo .zip) e movê-lo para um local específico do sistema (/opt ou /usr/exam por exemplo, o local será especificado na prova) e descompactá-lo.
  • Na prova será dito onde está o jboss eap (por exemplo: /home/jboss/course-files/Versao Enterprise EAP 6\jboss-eap-6.0.1.zip) e será solicitado para instalá-lo em um local específico (/usr/local/jboss/exam por exemplo)
      • Verifique se esse local existe:
        • $cd /usr/local/jboss/exam
      • Caso não exista, crie-o:
        • $mkdir -p /usr/local/jboss/exam
      • Naveque até o diretório:
        • $cd /usr/local/jboss/exam
      • Copie o jboss para este diretório
        • $cp /home/jboss/course-files/Versao\ Enterprise\ EAP\ 6\jboss-eap-6.0.1.zip .
        • $ls
      • Descompacte o arquivo
        • $unzip jboss-eap-6.0.1.zip
        • $ls
      • Remova o pacote zip
        • $rm jboss-eap-6.0.1.zip
        • $ls
      • Mas se a prova disser que o root do jboss tem que ficar em "/usr/local/jboss/exam" você deve copiar tudo da pasta "/usr/local/jboss/exam/jboss-eap-6.0" para "/usr/local/jboss/exam"
        • $mv jboss-eap-6.0/* .
        • $rm -Rf jboss-eap-6.0
        • $ls
      • Teste indo até a raiz e iniciando o jboss
        • $cd /
        • $./usr/local/jboss/exam/bin/standalone.sh

3) Instalar outras bibliotecas nativas específicas do sistema operacional para aprimorar o desempenho do JBoss EAP


https://community.jboss.org/wiki/RedHatCertifiedJBossAdministrator-JBossEAP6-Parte3

  • O native tem libs do hornetq e apr connector
  • Copie o zip (na prova será indicado onde ele estará, /home/jboss/course-files/Versao\ Enterprise\ EAP\ 6\jboss-eap-native-6.0.1-RHEL6-x86_64.zip por exemplo) para diretório /tmp (apenas para organização)
    • $cd /tmp
    • $cp /home/jboss/course-files/Versao\ Enterprise\ EAP\ 6\jboss-eap-native-6.0.1-RHEL6-x86_64.zip .
    • $ls
  •  Descompacte
    • $unzip jboss-eap-native-6.0.1-RHEL6-x86_64.zip
    • $ls
  • Copie as libs (.so) para a pasta do jboss
    • $cp -Rap jboss-eap-6.0/modules/org/hornetq/main/lib/* /usr/local/jboss/exam/modules/org/hormetq/main/lib/
    • $cp -Rap jboss-eap-6.0/modules/org/jboss/as/web/main/lib/ /usr/local/jboss/exam/modules/org/jboss/as/web/main/
  • Agora as libs já foram copiadas, mas é preciso dizer ao JBoss para reconhecer estas libs, isto é feito no arquivo modules.xml do módulo em questão
    • $cd /usr/local/jboss/exam/modules/org/hormetq/main/
    • $vim modules.xml
      • Adicionar <resource-root path="lib/linux-x86_64">
    • $cd /usr/local/jboss/exam/modules/org/jboss/as/web/main/
    • $vim modules.xml
      • Adicionar <resource-root path="lib/linux-x86_64">
  • É preciso dizer agora ao subsystem web para utilizar as native libs. No modo standalone, edite o standalone.xml
    • $cd /usr/local/jboss/exam/standalone/configuration
    • $vim standalone.xml
      • No subsystem web altere native="false" para native="true"
      • No subsystem logging:
        • Altere em root-logger o level name="INFO" para level name="DEBUG"
        • Altere em console-handler o level name="INFO" para level name="DEBUG"
        • Essas alterações no log são para podermos confirmar que as bibliotecas nativas estão sendo utilizadas
  • Inicie o jboss e veja se as libs native aparecem:
    • $cd /
    • $./usr/local/jboss/exam/bin/standalone.sh
  • Lembre-se: Se a prova não pedir para utilizar as libs nativas, não faça esses passos. Faça somente o que a prova pedir!

4) Configurar os requisitos mínimos de segurança para acessar e gerenciar o JBoss EAP. Acessar e gerenciar o JBoss EAP usando as ferramentas fornecidas.


https://community.jboss.org/wiki/RedHatCertifiedJBossAdministrator-JBossEAP6-Parte4

  • Crie um usuário de gerenciamento
    • $cd /usr/local/jboss/exam/
    • $./bin/add-user.sh
      • Escolha a opção a (Management User)
      • Dê enter para utilizar a Realm padrão
      • Dê um nome para o usuário
      • Dê uma senha
      • Digite "yes" para aplicar a realm
      • Digite "no" pois o usuário criado não fará a ação perguntada
  • Abra o arquivo mgmt-user.properties e verifique se o usuário foi criado corretamente
    • $ vim standalone/configuration/mgmt-user.properties
  • Inicie o JBoss
  • $cd /
  • $./usr/local/jboss/exam/bin/standalone.sh
  • Em outro terminal, acesse o JBoss via CLI:
  • $cd /usr/local/jboss/exam/
  • $./bin/jboss-cli.sh -c
  • Pronto, você está conectado via CLI no JBoss. A opção "-c" é para já entrar conectado.
  • Acesse via browser: http://localhost:9990 e digite usuário e senha, dessa forma você está acessando a interface web para gerenciamento do jboss.
  • Para acessar remotamente o CLI e a interface web de gerenciamento você precisa iniciar o JBoss com o parâmetro: -Djboss.bind.address.management=0.0.0.0

sábado, 26 de janeiro de 2013

Could not determine type for [..] at table [..] for columns [..]

Oi, hoje tive o erro abaixo ao iniciar minha aplicação EJB no JBoss 6

13:57:23,368 INFO [org.hibernate.validator.engine.resolver.DefaultTraversableResolver] Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
13:57:23,380 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] Error installing to Start: name=persistence.unit:unitName=test-ear-1.0.0.ear/test-ejb-1.0.0.jar#l8 state=Create: javax.persistence.PersistenceException: [PersistenceUnit: test] Unable to build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:900) [:3.5.5-Final]
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74) [:3.5.5-Final]
at org.jboss.jpa.builder.DefaultCEMFBuilder.build(DefaultCEMFBuilder.java:47) [:1.0.2-alpha-1]


[...]

at java.lang.Thread.run(Thread.java:662) [:1.6.0_25]
Caused by: org.hibernate.MappingException: Could not determine type for: br.com.localhost8080.test.company.Company, at table: MY_TABLE, for columns: [org.hibernate.mapping.Column(company)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:291) [:3.5.5-Final]
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:275) [:3.5.5-Final]
at org.hibernate.mapping.Property.isValid(Property.java:217) [:3.5.5-Final]

O Problema era que eu tinha uma coluna mapeada assim:

@JoinColumn(name = "ID_COMPANY", nullable = false)
private Company company;

Mas ela precisa do @ManyToOne

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ID_COMPANY", nullable = false)
private Company company;

Ao fazer dessa forma funcionou normalmente : )

Vaaleu!!
Adriano Schmidt

sexta-feira, 18 de março de 2011

JBoss 6 Final eclipse

Olá, utilizando o JBoss 6 M5 no eclipse tudo ocorria bem, quando fui migrar para o JBoss 6 Final tive o seguinte erro:

Error installing to Instantiated: name=PostEjbJarMetadataDeployer state=Described: java.lang.NoSuchMethodError: javax.annotation.Resource.lookup()Ljava/lang/String;

Para resolver bastou adicionar nos VM arguments o seguinte:

-Djava.endorsed.dirs="C:\jboss-6.0.0-Final\lib\endorsed"

Troque C:\jboss-6.0.0-Final pela pasta do seu JBoss.

Fontes:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=250643
http://community.jboss.org/message/587813?tstart=60

Vaaleu!

sexta-feira, 4 de fevereiro de 2011

persistence.xml dinâmico

E aew!

Bom, eu defino o hibernate.dialect no persistence.xml, porém o meu persistence.xml estava dentro do meu ear.. dessa forma quando fosse necessário trocar o dialeto, era necessário alterar o ear. Eu não queria isso. Então para externalizar o hibernate.dialect tentei o seguinte:

Tirei a linha do hibernate.dialect do persistence.xml e iniciei o JBoss passando o parâmetro -Dhibernate.dialect=org.hibernate.dialect.MySQLDialect

Aconteceu o seguinte erro:

17:55:16,514 ERROR [JDBCExceptionReporter] Unexpected token: LAST_INSERT_ID in statement [select last_insert_id()]
state=Create: java.lang.RuntimeException: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not retrieve generated id after insert:
[org.jboss.ejb3.timerservice.mk2.persistence.TimeoutMethod]

Bom, pra resolver isso iniciei o JBoss com um parâmetro diferente:
-Dlocalhost8080.hibernate.dialect=org.hibernate.dialect.MySQLDialect

E essa propriedade eu usei no persistence.xml:
<property name="hibernate.dialect" value="${localhost8080.hibernate.dialect}"/>

Obs: Você pode trocar o localhost8080 do localhost8080.hibernate.dialect para o nome do seu projeto.

Pronto, dessa forma tudo funcionou!!!!


Também seria possível configurar o hibernate.dialect via código, mas não era esse meu objetivo.

Se você quiser colocar essa propriedade (localhost8080.hibernate.dialect) num arquivo de propriedades para que não seja necessário setá-la na inicialização do JBoss, faça o seguinte:

No arquivo properties-service.xml que fica em <jboss>\server\<context>\deploy dentro do mbean SystemProperties deve adicionar a propriedade, ficando dessa forma:

<mbean code="org.jboss.varia.property.SystemPropertiesService"
name="jboss:type=Service,name=SystemProperties">

<attribute name="Properties">
localhost8080.hibernate.dialect=org.hibernate.dialect.MySQLDialect
</attribute>

</mbean>

Vaaaleu!
Adriano Schmidt

quarta-feira, 22 de dezembro de 2010

Failed to register driver for: com.mysql.jdbc.Driver

Ao iniciar o JBoss aconteceu o erro:

Caused by: org.jboss.resource.JBossResourceException: Failed to register driver for: com.mysql.jdbc.Driver;
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver from BaseClassLoader@1b64925

Para resolver coloquei o driver do MySQL em < Pasta do JBoss >/server/< contexto >/lib

Você pode baixar o driver em http://dev.mysql.com/downloads/connector/j/ depois descompacte e pegue o arquivo .jar, esse é o arquivo que você deve jogar em < Pasta do JBoss >/server/< contexto >/lib

; )