Pessoal..
Tive que instalar um GlassFish em um cliente.. por mais que seja uma operação simples vou documentar aqui o passo-a-passo.
* Verifique se existe o JDK está instalado na máquina (Caso não esteja, você vai precisar instalar)
$java -version
* Baixe o zip do GlassFish (Existem os instaladores .exe e .sh, mas eu sempre prefiro os zip's)
https://glassfish.java.net/downloads/3.1.2.2-final.html
* Descompacte o zip na pasta desejada. Se for linux pode ser algo assim:
$cd /home
$mkdir glassfish-3.1.2.2
$cd glassfish-3.1.2.2
[então você copia para essa pasta o zip]
$unzip glassfish-3.1.2.2.zip
* Agora é só startar, para isso basta executar os seguintes comandos:
$cd /home/glassfish-3.1.2.2/glassfish3/glassfish/bin/
$nohup ./startserv &
$[ctrl + c]
* Para parar o GlassFish basta executar os seguintes comandos:
$cd /home/glassfish-3.1.2.2/glassfish3/glassfish/bin/
$./stopserv
* Para acessar é só utilizar estas URLs:
Home: http://[IP DA MÁQUINA]:8080/
Admin: http://[IP DA MÁQUINA]:4848/
* O ideal é startar através de um serviço ou algo do gênero para ser mais fácil para os administradores do ambiente.
* Outra coisa, recomendo NUNCA startarem o GlassFish com o usuário root. Pois através de uma aplicação Java, com poucas linhas de código, caso o servidor de aplicação tenha sido startado com root, é possível acessar e alterar o disco, entre outras atividades não desejáveis.
* Para liberar acesso ao console administrativo por outras máquinas é necessário realizar os seguintes comandos:
$./asadmin --port 4848 change-admin-password
Enter admin user name [default: admin]> [Apenas aperte enter]
Enter admin password> [Apenas aperte enter]
Enter new admin password> [Digite a senha para o admin]
Enter new admin password again> [Digite a senha para o admin]
Command change-admin-password executed successfully.
$./asadmin --host [IP DESSA MÁQUINA] --port 4848 enable-secure-admin
Bom, é isso galera. Precisando podem comentar aqui no post que eu tentarei ajudar.
Abraços!
Adriano Schmidt
terça-feira, 10 de dezembro de 2013
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
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, 27 de agosto de 2013
Error loading theme, cannot find "theme.css" resource of "primefaces-bootstrap" library
Pessoal.. hoje tive o erro:
[8/27/13 15:17:23:188 BRT] 00000043 CustomExcepti E Error loading theme, cannot find "theme.css" resource of "primefaces-bootstrap" library
javax.faces.FacesException: Error loading theme, cannot find "theme.css" resource of "primefaces-bootstrap" library
at org.primefaces.renderkit.HeadRenderer.encodeTheme(HeadRenderer.java:130)
at org.primefaces.renderkit.HeadRenderer.encodeBegin(HeadRenderer.java:92)
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:579)
at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:519)
at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:533)
at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1581)
at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:264)
at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:116)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1224)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:456)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:97)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:928)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1025)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:895)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)
at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1659)
[8/27/13 15:17:23:188 BRT] 00000043 SystemOut O
DEBUG ERROR
[8/27/13 15:17:23:188 BRT] 00000043 SystemOut O
O erro foi pois eu tinha isso no meu web.xml:
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>bootstrap</param-value>
</context-param>
porém eu não tinha a dependência no meu pom.xml para o primefaces-bootstrap.. por isso acontecia o erro..
Abraços!
Adriano Schmidt
[8/27/13 15:17:23:188 BRT] 00000043 CustomExcepti E Error loading theme, cannot find "theme.css" resource of "primefaces-bootstrap" library
javax.faces.FacesException: Error loading theme, cannot find "theme.css" resource of "primefaces-bootstrap" library
at org.primefaces.renderkit.HeadRenderer.encodeTheme(HeadRenderer.java:130)
at org.primefaces.renderkit.HeadRenderer.encodeBegin(HeadRenderer.java:92)
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:579)
at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:519)
at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:533)
at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1581)
at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:264)
at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:116)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1224)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:456)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:97)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:928)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1025)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:895)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)
at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1659)
[8/27/13 15:17:23:188 BRT] 00000043 SystemOut O
DEBUG ERROR
[8/27/13 15:17:23:188 BRT] 00000043 SystemOut O
O erro foi pois eu tinha isso no meu web.xml:
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>bootstrap</param-value>
</context-param>
porém eu não tinha a dependência no meu pom.xml para o primefaces-bootstrap.. por isso acontecia o erro..
Abraços!
Adriano Schmidt
sexta-feira, 2 de agosto de 2013
Buscar cidade pelo IP
Oi pessoal : )
Hoje tive que, pelo IP, descobrir a cidade do usuário.
Estou fazendo este post para repassar minhas descobertas : )
Antes de mais nada, caso você queira saber o seu IP é só acessar: http://www.whatismyip.com/
Resumindo (e correndo o risco de que você não termine de ler este post) o jeito mais simples é esse:
http://freegeoip.net/json/170.130.90.30
Esse serviço Rest é free e retorna em JSON a cidade e outras informações pelo IP. Você pode acessá-lo diretamente pelo browser ou via programação fazendo uma chamada Rest.
Essa busca é feita com base em um banco de dados gigante que é atualizado diariamente. Ele não é 100% preciso mas ajuda bastante!
Existe a possibilidade de que o retorno seja XML, CSV.
Mais detalhes e limitações em: http://freegeoip.net/
O freegeoip utiliza um banco de dados free da MaxMind
Você pode utilizar diretamente o serviço rest da MaxMinds, ela tem 2 modelos de serviço:
Free: Tem um número limitado de consultas e você tem que botar um link para o site da MaxMind no seu site
Pago: Mais precisão e garantia que o serviço estará no ar.. são 20 dólares para 50.000 consultas, tem outros planos também.
Mais detalhes e limitações em: http://www.maxmind.com/pt/geolocation_landing
Outra possibilidade é usar a API de GeoLocation do HTML5:
http://www.w3schools.com/html/html5_geolocation.asp
Aí você consegue pegar latitude e longitude aproximada da pessoa, e com isso pode buscar a cidade.
Existe uma diferença, talvez desvantagem, em fazer dessa forma é que o usuário terá que autorizar o sistema a utilizar sua localização. Aparecerá uma janela com a mensagem "Deseja compartilhar sua localização com este site?"
Enfim, a busca pela cidade por lat e lng pode ser feita de duas formas:
Serviço Google:
Procure por Geocodificação reversa (busca de endereços) em: https://developers.google.com/maps/documentation/geocoding/?hl=pt-br
Observação: a Google Geocoding API só pode ser usada junto com um mapa do Google; é proibido usar os resultados da geocodificação sem exibi-los em um mapa
Banco de dados próprio
É possível buscar em um banco de dados ou arquivo de cidades com suas respectivas latitudes e longitudes.. aí é só você fazer um algoritmo simples de aproximação.
Esse site tem uma lista das maiores cidades do Brasil com lat e lng: http://www.mapsofworld.com/lat_long/brazil-lat-long.html
Você também pode pegar essa lista direto do IBGE, procure no google por Cidades_do_Brasil_2008.rar que você via achar.
https://pt.vpnmentor.com/ferramentas/ipinfo/
Abraaço!!!
Adriano Schmidt
PS: Agradeço ao Rafael dos Santos que fez esta pesquisa comigo!
Hoje tive que, pelo IP, descobrir a cidade do usuário.
Estou fazendo este post para repassar minhas descobertas : )
Antes de mais nada, caso você queira saber o seu IP é só acessar: http://www.whatismyip.com/
FreeGeoIP
Resumindo (e correndo o risco de que você não termine de ler este post) o jeito mais simples é esse:
http://freegeoip.net/json/170.130.90.30
Esse serviço Rest é free e retorna em JSON a cidade e outras informações pelo IP. Você pode acessá-lo diretamente pelo browser ou via programação fazendo uma chamada Rest.
Essa busca é feita com base em um banco de dados gigante que é atualizado diariamente. Ele não é 100% preciso mas ajuda bastante!
Existe a possibilidade de que o retorno seja XML, CSV.
Mais detalhes e limitações em: http://freegeoip.net/
O freegeoip utiliza um banco de dados free da MaxMind
MaxMind
Você pode utilizar diretamente o serviço rest da MaxMinds, ela tem 2 modelos de serviço:
Free: Tem um número limitado de consultas e você tem que botar um link para o site da MaxMind no seu site
Pago: Mais precisão e garantia que o serviço estará no ar.. são 20 dólares para 50.000 consultas, tem outros planos também.
Mais detalhes e limitações em: http://www.maxmind.com/pt/geolocation_landing
API de GeoLocation do HTML5
Outra possibilidade é usar a API de GeoLocation do HTML5:
http://www.w3schools.com/html/html5_geolocation.asp
Aí você consegue pegar latitude e longitude aproximada da pessoa, e com isso pode buscar a cidade.
Existe uma diferença, talvez desvantagem, em fazer dessa forma é que o usuário terá que autorizar o sistema a utilizar sua localização. Aparecerá uma janela com a mensagem "Deseja compartilhar sua localização com este site?"
Enfim, a busca pela cidade por lat e lng pode ser feita de duas formas:
Serviço Google:
Procure por Geocodificação reversa (busca de endereços) em: https://developers.google.com/maps/documentation/geocoding/?hl=pt-br
Observação: a Google Geocoding API só pode ser usada junto com um mapa do Google; é proibido usar os resultados da geocodificação sem exibi-los em um mapa
Banco de dados próprio
É possível buscar em um banco de dados ou arquivo de cidades com suas respectivas latitudes e longitudes.. aí é só você fazer um algoritmo simples de aproximação.
Esse site tem uma lista das maiores cidades do Brasil com lat e lng: http://www.mapsofworld.com/lat_long/brazil-lat-long.html
Você também pode pegar essa lista direto do IBGE, procure no google por Cidades_do_Brasil_2008.rar que você via achar.
Direto pelo browser
Sem API, mas forma rápida e free:https://pt.vpnmentor.com/ferramentas/ipinfo/
Abraaço!!!
Adriano Schmidt
PS: Agradeço ao Rafael dos Santos que fez esta pesquisa comigo!
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
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
segunda-feira, 24 de junho de 2013
Caixa de ferramentas do arquiteto Java
Gosto de uma definição antiga que pode ser usada até hoje:
Eu tenho trabalhado como consultor em muitos clientes e tenho que tomar diversas decisões arquiteturais sobre tecnologias e ferramentas e também sobre ALM (Application Lifecycle Management). Estou fazendo este post para falar de algumas ferramentas que temos à nossa disposição e que devemos conhecer.
Vale lembrar que a escolha das tecnologias e ferramentas sempre depende de inúmeras variáveis, é necessário entender a aplicação, requisitos, objetivos e limitações para tomar a melhor decisão.
E ferramentas, na verdade, são úteis apenas com a definição de técnicas e de processos de forma adequada.
Enfim, vamos lá! Separei algumas ferramentas por tópicos:
Análise de requisitos, arquitetura e design
O mais importante na análise de requisitos são as técnicas utilizadas, conseguir obter o máximo de informações e detalhá-las conforme necessidade.Uma ferramenta bem robusta é o Enterprise Architect (EA), porém, gasta-se muito tempo para trabalhar com esta ferramenta.
Existe a possibilidade de trabalhar com arquivos de texto como o Word, porém, não são documentos vivos, uma ideia interessante é utilizar uma ferramenta de wiki, como o xwiki por exemplo. O Confluence da Atlassian é muito bom também para documentação e compartilhamento de conhecimentos.
É interessante o uso de ferramentas para criação de fluxos e diagramas como o Astah (antigo Jude) e o Bizagi.
Para criação de protótipos eu sempre utilizo o Balsamiq Mockups, ele é fantástico! Existem outras opções como o Axure, que é um mais robusto, mas o Balsamiq é mais simples e atente em quase todas as situações.
Gerenciamento de Projetos
O MS Project é ótimo para gerar e organizar cronogramas.O Jira (ou RedMine, que é basicamente uma versão free do Jira) é muito bom para gerenciar as atividades de um projeto. Você cadastra um projeto, coloca as atividades e o número de horas, delega para os responsáveis, e tem um visão bem clara de tudo que está acontecendo. Estas ferramentas também servem para registrar bugs, é possível visualizar quantos erros aconteceram, de qual tipo, tem diversos gráficos e formas de visualização. Você também pode criar um workflow com todos os passos e responsáveis para cada atividade. Caso você vá usar RedMine, sugiro a instalação do plugin Monitoramento e Controle para melhor visualização das atividades.
Se você for trabalhar com Agile o GreenHopper é uma ótima opção. O Trello é um software de kanban muito eficiente em que você pode organizar seus projetos, atribuir responsáveis, entre outras funcionalidades.
Se você precisa de um produto que seja integrado com a folha de pagamento, que gera relatórios para enviar aos clientes, você pode procurar sistemas próprios para isso, porém, talvez exista a necessidade de customização.
Criação de código (IDE)
Sou adepto da ideia que cada desenvolvedor deve ser livre para escolher sua IDE.Eu sempre trabalho com o Eclipse, ou com o JBoss Developer Studio (que é o Eclipse com diversos plugins da JBoss), mas caso o desenvolvedor queira usar NetBeans, ou alguma outra IDE (IntelliJ IDEA por exemplo), ou até mesmo um editor de textos qualquer ele deve poder! Para isso deve ser utilizado o Maven, que, entre outras coisas, organiza o projeto para que ele possa ser utilizado com qualquer IDE, ou sem nenhuma.
Repositório de fontes
Há muito tempo era utilizado o CVS, porém, com o surgimento do SVN ele não é mais recomendado.O SVN é simples de usar e muito eficiente e eficaz.
Caso você tenha uma equipe entusiasta por tecnologia e que abrace a ideia, é uma excelente ideia utilizar o GIT. Ele é mais complexo e mais difícil de aprender, no entanto, traz inúmeras vantagens.
Outra opção é o TFS para versionamento de fontes, mas acredito que ele é extremamente eficiente para projetos com tecnologias Microsoft, mas não para projetos Java, mesmo as versões mais novas do TFS.
Existe ainda o Mercurial, este eu não conheço muito, não conheço muitas empresas que o utilizam.
Existem diversos padrões, utilizados mundialmente, para versionamentos, criação de tags e branches, é de extrema importância definir este processo.
Build automation e Integração contínua
Recomendo a utilização do Jenkins, nele você pode rodar compilação automática, rodar scripts de testes, de validação de código e atualizar ambientes.O Jenkins é free e opensource, ele sempre me atendeu 100%. Outra opção é o Bamboo, da Atlassian.
Qualidade
Para garantir a qualidade, além dos testes manuais (abrir a tela e verificar se está funcionando) existem outras formas de manter a qualidade como validação de fontes, testes unitários e testes de interface.Estes testes e validações podem ser rodados automaticamente na integração contínua através do Maven, dessa forma você pode verificar a cada commit se algum teste parou de funcionar ou se alguma política de validação de fonte foi desreipeitada. Caso isso ocorra é enviado um e-mail para quem fez o commit e para os responsáveis pelo projeto.
Para validação de fontes recomendo a utilização de PMD e Checkstyle. Essas ferramentas verificam vários problemas no código. Existem plugins para o eclipse para utilização destas ferramentas. E elas também são rodadas via Maven (ou seja, independem de IDE). Para uma melhor visualização de tudo isso deve ser utilizado o Sonar, que oferece uma tela web para visualização de todos os problemas de código.
Para testes unitários o Arquillian é excelente! É interessante utilizar uma ferramenta que verifica quantas e quais linhas do seu fonte estão sendo cobertas pelos testes, para isso pode ser utilizado o Sonar ou o EclEmma ou o Atlassian Clover ou ainda alguma outra ferramenta.
Se o sistema for SAAS (ou se tiver uma grande preocupação com performance), é importante também escrever testes de desempenho utilizando ferramentas como JMeter, NewRelic, VisualVM, jConsole, entre outras.
Para testes de interface eu já utilizei o Visual Studio para projetos Java Web, achei muito bom, porém, a licença é cara. Quem conhece Java não terá dificuldade para trabalhar com ele, é utilizado C# para escrever os testes de tela. Uma opção free e bem semelhante às ferramentas de teste da Microsoft é o Selenium.
O ideal é estabelecer um processo de desenvolvimento onde sempre se escrevem testes automatizados e uma política de PMD e Checkstyle. Então para liberar uma versão, todos os testes automatizados devem rodar sem erros e a política estabelecida de PMD e Checkstyle deve ser atendida. Com certeza também é importante sempre fazer testes manuais, os próprios desenvolvedores podem testar o que outros desenvolvedores testaram, ou pode ser criada uma equipe de qualidade ou definir uma pessoa para ser tester.
Criação de Help On-line
Com um código bem documentado, é bacana a geração e publicação do JavaDoc. Através das ferramentas de validação de código é possível verificar se os códigos estão ou não documentados.Mas é possível criar um help on-line de outras formas também, o xwiki é uma opção bacana!
Para a criação de help por página sistema de forma automática talvez exista alguma ferramenta para isso. É possível criar um mecanismo de links, tive que fazer isso em um produto e criei eu mesmo uma estrutura de documentação seguindo alguns padrões que eu defini.
I18n
Pode-se utilizar arquivos de textos, que é a opção mais simples. Porém, já trabelhei salvando as traduções em um banco de dados, é possível trabalhar com cache para melhorar a performance e fica muito bom também. Existem outras estratégias para corrigir problemas de performance com traduções.Existe ainda a possibilidade de trabalhar com as traduções na Cloud, com a ferramenta transifex por exemplo.
Existem diversos padrões para serem seguidos com relação a tradução, para evitar problemas de formatos de campos, documentos, entre outras coisas.
Conclusão
Primeiro temos que definir ideias, definir o que queremos e o que é preciso de verdade. Após isso deve-se pensar em ferramentas para atender as necessidades.Temos à nossa disposição inúmeras ferramentas, mas temos que entender melhor cada situação para utilizarmos as ferramentas adequadas.
Um grande abraço!
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
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á!!
https://community.jboss.org/wiki/RedHatCertifiedJBossAdministrator-JBossEAP6-Parte1
https://community.jboss.org/wiki/RedHatCertifiedJBossAdministrator-JBossEAP6-Parte2
https://community.jboss.org/wiki/RedHatCertifiedJBossAdministrator-JBossEAP6-Parte3
https://community.jboss.org/wiki/RedHatCertifiedJBossAdministrator-JBossEAP6-Parte4
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
quarta-feira, 13 de março de 2013
Serialização em Java
Pessoal, segue um exemplo de serilização em Java, como eu precisava passar meu objeto como string eu usei a classe HexBin da Apache, para isso adicionei a lib xmlbeans-2.3.0.jar ao meu projeto.
Segue exemplo abaixo:
Abraço!!
Adriano Schmidt
Segue exemplo abaixo:
import java.io.Serializable; import java.util.Date; public class MyObject implements Serializable { private static final long serialVersionUID = 1L; private Boolean myBoolean = true; private String myString = "s"; private Date myDate = new Date(); public String toString() { return "MyObject [ myBoolean=" + myBoolean + ", myString=" + myString + ", myDate=" + myDate + " ]"; } }
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import org.apache.xmlbeans.impl.util.HexBin; public class Main { public static void main(String[] args) { // Voce tem um objeto MyObject objetoInicial = new MyObject(); // serializa ele e o transforma em String byte[] bytesSerializados = Main.serialize(objetoInicial); String stringFromBytes = HexBin.bytesToString(bytesSerializados); // depois voce pode, a partir da String, transformar ele em bytes novamente // e deserializar transformando-o no objeto inicial novamente byte[] bytesFromString = HexBin.stringToBytes(stringFromBytes); MyObject objetoDeserializado = (MyObject) Main.deserialize(bytesFromString); System.out.println(objetoInicial); System.out.println(objetoDeserializado); } /** * Funcao para serializar um objeto */ public static byte[] serialize(Object obj) { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream os = null; try { os = new ObjectOutputStream(out); os.writeObject(obj); } catch (IOException e) { e.printStackTrace(); } return out.toByteArray(); } /** * Funcao para deserializar um objeto */ public static Object deserialize(byte[] data) { ByteArrayInputStream in = new ByteArrayInputStream(data); try { ObjectInputStream is = new ObjectInputStream(in); return is.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } }
Abraço!!
Adriano Schmidt
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
O Problema era que eu tinha uma coluna mapeada assim:
Mas ela precisa do @ManyToOne
Ao fazer dessa forma funcionou normalmente : )
Vaaleu!!
Adriano Schmidt
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
Assinar:
Postagens (Atom)