terça-feira, 10 de dezembro de 2013

Instalar GlassFish 3.1.2.2 (build 5) - Final

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

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, 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

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/

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

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:

“O arquiteto ideal deve ser uma pessoa erudita, um matemático, familiarizado com estudos históricos, um estudioso aplicado de filosofia, conhecedor de música, que não desconheça medicina, detentor de saber jurídico e familiarizado com astronomia e cálculos astronômicos.“ (Vitruvius, 25 A.C.)

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

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

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:

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

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