Thursday, July 09, 2009

Seam Component x Contextos

Complementando o ótimo post do Dr. Spock, na sequência coloco os tipos de Seam Component e quais contextos do Seam podem ou devem ser usados:
  • Session Stateful (EJB) - por default é mantido em APPLICATION. Nunca devem ser associados a STATELESS ou PAGE.
  • Session Stateless (EJB) - sempre mantido em STATELESS. Toda cada vez que requisitado o Seam busca uma instância (lookup).
  • JPA Entity class - por default é mantido em CONVERSATION, nunca devem ser usados em STATELESS já que em algum momento devem ser sincronizados na base de dados.
  • JavaBean / POJO - por default ficam em EVENT.
  • Message Driven Bean - atua como uma listerner para Topic ou Queue, não é mantido em contexto Seam.

Sunday, July 05, 2009

Testando Google Wave

Essa semana fui um dos vários convidados para testar o Google Wave. A ferramenta esta em fase de testes, vários ajustes e melhorias devem ser efetuados, na minha opnião o conceito da ferramenta eh show de bola. Principalmente a ideia de plataforma aonde vc consegue criar/estender elementos e rodar no wave.

Veja essa página que comenta sobre extensões do Wave:

Vc tem 2 alternativas para criar elementos para o Wave:
  • Robots - robô que atua como um participante/convidado de uma determinada Wave, como por exemplo um corretor ortográfico.
  • Gadgets - pequenos aplicativos que rodam dentro da Wave, e compartilham seu estado para todos os participantes da mesma Wave, como por exemplo um mapa com a rota para uma balada.

JBoss Seam Timeout Conversation

Essa semana estava fussando bastante no Seam, e de repente pintou uma questão:
Qual é o timeout default do conversation caso o usuário não aciona uma requisição para o método @End? Será a mesma da Session?

A resposta é 10 minutos por default, encontrei isso no livro Seam In Action (pag. 300), ótimo por sinal!

Vc pode sobreescrever no component.xml, usando a tag:
core:manager timeout="600000"

Uma outra opção é usar a property timeout da tag page no mapeamento de view's (pages.xml):
page id="/cadastro.xhtml" timeout="300000"

Sunday, June 21, 2009

Hibernate Performance

Ótima apresentação do Emmanuel Bernard - co-autor de Hibernate Search in Action - mostrando algumas práticas e observações para escalar c/ Hibernate.

Sunday, June 14, 2009

Concorrência - Iterar HashSet

Na sequência um exemplo de código que encapsula acesso a um HashSet de forma segura (nem tanto...):

public class IteracaoVulneravel {

  private Set palavras = new HashSet();

  public synchronized void removePalavra(String palavra) {
    palavras.remove(palavra);
  }

  public synchronized void addPalavra(String palavra) {
    palavras.add(palavra);
  }

  //pode lançar java.util.ConcurrentModificationException
  public void print() {
    System.out.println("Palavras = "+palavras);
  }
}

O detalhe fica no método print, o compilador implicitamente cria código para navegar na coleção usando o Iterator, para realizar o print dos elementos.
Durante a iteração no elementos ninguém garante que uma outra thread acione o método addPalavra. Caso isso aconteça uma java.util.ConcurrentModificationException será lançada!

Para evitar isso o recomendado seria sincronizar a coleção, veja.

Interessante observação do livro Java Concurrency in Practice.

Sunday, May 31, 2009

Extensões GWT

Essa semana estava finalizando a estrutura para o mini-curso de Gwt, já esta quase fechado!
Um outro detalhe interessante a respeito dessa tecnologia eh a possibilidade de criar ou usar bibliotecas/extensões de Componentes Visuais (UI), tornando o desenvolvimento bem mais produtivo.

Desenvolvendo com gwt tive experiência com a extensão GXT, Gwt Ext através do gwt usa o framework javascript Ext, que sem duvida é uma suite bem completa e "rica". Veja o show case aqui.

Essa semana encontrei uma outra alternativa um concorrente chamado SmartGwt. Os componentes são bem parecidos com o GXT, mas na minha opinião a grande vantagem é a licença, além de open-source o SmartGwt eh LGPL. Compare, acesse o show case aqui.

Gosto muito do conceito de bibliotecas visuais, provavelmente por usar essa ideia quando trabalhava com Delphi. Um outro exemplo que dispensa comentarios é o JSF que no seu core foi projeto para isso, confira aqui.

Sunday, May 24, 2009

GWT no OpenTDC

OpenTDC foi demais, só pra variar a Globalcode detonando em mais um evento. Curti a palestra de Arquiteturas JSF, principalmente pela abordagem na visão de sistemas corporativos, maiores. As palestras sobre Agile e TV Digital foram show de bola!

No fim do eventou rolou um painel de JavaFX(Maurício Leal), Flex(Rafael Nunes) e GWT(Eu). Foi interessante falar do GWT apesar do tempo ter ficado apertado.

Parabéns pra Globalcode!

RIA pra cá, RIA pra lá...

Faz um certo tempo que venho me dedicando bastante em soluções RIA, principalmente em pesquisa e experimento das principais alternativas. Trabalhei em projetos c/ JSF (RichFaces - Facelets), Flex, e nos últimos dias com GWT, sem contar nas pesquisas e testes com JavaFx (nada em produção).

Na minha opinião classifico o Flex e JavaFx trazem um conceito de RIA muito mais "rich" do que boa parte das aplicações corporativas de hoje. Essas tecnologias tem um poder de iteratividade incrível, me questiono em relação a sistemas comuns, CRUD, "precisam dessa riqueza"? Acho que o JavaFX venha pra substituir a proposta Swing + Java WebStart, abraçando o mobile.

Nenhuma dessas tecnologias resolve tudo (silver bullet), mas é interessante ter experiência aonde nossa tecnologia preferida, no meu caso especificamente o JSF, pode não ser a melhor solução para tal cenário. No ultimo projeto que atuei o escolhido foi o GWT, a equipe já tinha uma experiência com Swing, só pra variar o tempo era curto o risco grande e não tinha como cobrir o risco em adotar JSF sem nenhum contado anterior.

Essa experiência foi interessante, além de aumentar o conhecimento, o melhor foi enxergar do outro lado do muro. Adquirir mais argumentos para comparações e levantar pontos fracos e fortes de ambos os lados. Um ponto interessante, precisa de um outro post, é qtde de legados e diversas opções que vão ficar por ai... Já pensou daqui uns 10 anos?

Sunday, May 10, 2009

De Java para Python

Algumas dicas que podem ajudar.

Friday, May 01, 2009

Open TDC 2009


Inscrições Abertas para o OpenTDC 2009 - Um Evento Java Gratuito realizado pela Globalcode com o objetivo de difundir o conhecimento e fortalecer ainda mais a comunidade de profissionais que trabalham com Java.

O evento vai abordar algumas tendências em desenvolvimento como TV Digital, JavaFX e Flex, Arquiteturas Java EE com JSF, JBoss Seam e Spring e, também, uma palestra muito interessante sobre o uso de Java e Robótica aplicados à automação residencial e ao ensino de programação.

Não perca tempo, inscreva-se e participe !

Data: 17/05/2009 (Domingo)
Local: Universidade Anhembi Morumbi Campus Vila Olímpia. Rua Casa do Ator, 275, Itaim Bibi, São Paulo-SP

Outras informações: http://www.globalcode.com.br

N
ão perca!

Sunday, April 26, 2009

Web Beans chegando...

Primeiro preview liberado!
Veja.

Saturday, April 18, 2009

Salvando entidades além do convencional

Outro dia encontrei algumas referencias comentando/procurando uma solução simples a respeito da persistência de entidades que possuem relacionamentos com certa complexidade (além do CRUD básico) com JPA/Hibernate, algo normal ao usar "domain model".

Pra não voltar aos DTO's, uma abordagem - questionável é claro - seria usar o id do objeto de origem para resgatar uma outra instância sob o escopo do EntityManager/Session e setar os "pedaços"/dados modificados no objeto origem na referencia gerenciada.

...
//recuperando instância gerenciada
Pedido pedidoGerenciado = getPedidoById(pedidoOrigem.getId());

//passando informações desejadas...
pedidoGerenciado.setDataEntrega(pedidoOrigem.getDataEntrega());
...


Ao encerrar a transação ou acionar o flush as alterações serão propagadas ao Banco.

Sunday, April 12, 2009

Sunday Reference

Domingão resolvi dar uma revisada na API do Java que trata referencias de objetos (Heap + GC). Semana passada me deparei com algumas delas nos testes que estava fazendo (post anterior).

Na realidade brinquei um pouco as especializações de java.lang.ref.Reference. Representam o modelo de referencia de objetos do Java e influenciando a execução do Garbage Collector (GC). São elas:

  • WeakReference: um wrapper de uma referencia (qualquer objeto) "fraca", quando necessario o GC ira eliminar.
  • SoftReference: outro wrapper, mas numa situação intermediaria nem tao fraca e nem tao forte. Na pratica tem uma durabilidade maior do que weak, mas qdo necessario - se necessário - o GC vai eliminar. Uma alternativa interessante para cache.
  • PhantomReference: o wrapper mais "frágil", o objeto já recebeu sua doze letal sem chance de escapar da pena de morte. Não há recuperação, o método get sempre retorna null.

Além dessas 3, temos outras classes nessa API:
  • WeakHashMap: Map composto pela chave WeakReference e valor a referencia, que sabe eliminar a chave qdo o valor for coletada pelo GC. Em outras coleções o WeakReference (ou os outros) não são removidos, apenas a referencia encapsulada.

Acesse o javadoc e confira.

Saturday, April 11, 2009

JVM - "Caixa Preta"

Gerenciar e monitorar os componentes e recursos utilizados por uma aplicação é uma tarefa complexa. Descobrir a causa de OutOfMemory não é algo simples, vc pode encontrar varios sites comentando sobre o problema e tentando apresentar uma solucao. O óbvio seria fazer uma analise da sua aplicação, mas como fazer um "top" para o Java?

Pra isso temos o "profile", ferramente que monitora "de cabo a rabo" o que o aplicativo esta fazendo e consumindo. Na teoria a ferramenta é perfeita, mas na pratica o uso pode ser inviável. Alguns colegas até brincam dizendo que "profile é perfeito, desde que vc não use em produção"! Por mais que vc tenha replicas do ambiente de produção, uma ótima cobertura de testes de stress/utilização, infelizmente alguns comportamentos só ocorrem no ambiente real! E agora?

Junto com a evolução da linguagem Java, a JVM também vem evoluindo bastante no quesito rastreabilidade e monitoramento, no Java 6 foram incorporadas algumas ferramentas com essas características. Na semana passada gastei um tempo estudando e testando algumas dessas ferramentas:
- jmap: faz um dump dos objetos da memória em arquivo físico: > jmap -dump:file=heap.bin
- jhat: ferramenta usada para fazer analise do dump: > jhat -J-mx512m heap.bin
- VisualVM: ferramenta gráfica para acompanhar/monitorar sua aplicação durante a execução. Mais funcionalidades do que o JConsole.

A partir da versão 6, é possível usar um parâmetro solicitando um "dump automático" da memória no caso de um OutOfMemory. Adicione o parâmetro -XX:HeapDumpPath=path_to_file no comando java (avalie o custo).

Tomara que com a evolução da plataforma no geral, essas ferramentas continuem melhorando, simplificando a vida de quem desenvolve e cuida do ambiente Java.

Mas, em casos mais complexos talvez vc tenha que apelar para o Profile, pagando o preço. Atualmente estou trabalhando com o Introscope da CA, uma ferramenta bem completa com consumo razoável, funciona sem "derrubar" o servidor.

Tive algumas experiencias com JProfile e YourKit.

Thursday, April 02, 2009

JSessionId em múltiplos contextos

Quando 2 aplicações dentro de um mesmo host/domínio usam sessão, se permitido, um cookie que armazena o jsessionid será gerado na maquina do cliente. Apenas um cookie ja que a criação é por dominio e não por contexto. Aparentemente nenhum problema, mas isso pode gerar um comportamento estranho e difícil de identicar.

No server-side (container) para as 2 aplicações teremos 2 instâncias de HttpSession um por contexto, da forma que deve ser. O jboss sabe mapear a request com o HttpSession do contexto correto, sem problemas.

Mas e se ...? O problema:
  • A aplicação X, com o erro intermitente, tem um time-out de session de 5 minutos.
  • X possui uma tela faz busca em outro contexto, a aplicação Y.
  • O host de Y eh o mesmo de X, e o seu time-out é de 2 minutos por exemplo.
  • O usuario ao autenticar em X e abrir a tela que aciona Y, sem saber possui 2 sessions, uma para cada aplicação, mas somente um cookie!
  • Caso o usuário depois ficasse 2 minutos trocando uma idéia no msn ou tomando um cafézinho, ao voltar pra tela que aciona Y, uma nova session seria gerada, já que a anterior expirou. Nova session, novo jsessionid, novo cookie!
  • Ao fazer uma request para X, o container ira receber um jsessionid desconhecido para o contexto, e ai adivinha? Session "perdida".

Ficamos quase uma semana de cabelo em pé, para descobrir o porque do "sumiço" da session Demorou pra se ligar nesse detalhe.

Sunday, March 22, 2009

AOP em JavaScript

Usando AOP em JavaScript, aqui.

Wednesday, March 11, 2009

Spring Rich Client

Essa é a bola da vez...
Aqui a documentação, muito superficial por sinal. Nao imagina que o spring tinha "uma extensão" pra isso. Bem legal a swingueira!

Importar certificado JVM

Pra guardar...
Abaixo comando de import do certificado digital para jvm:

$ keytool -import -trustcacerts -keystore <%JAVA_HOME%>\jre\security\lib\
    cacerts -storepass changeit -noprompt -alias mycert -file mycert.cer

mycert=nome do certificado.

Friday, March 06, 2009

Class x Prototype

Ótima comparação entre conceito de Classes (O.O.) versus Prototipação, mozilla.

Saturday, February 28, 2009

MooTools

+ um frame js.