19 de jan. de 2010

Weblogic JMS - Parte II - Arquitetura JMS

Neste post, faço um resumo da arquitetura de JMS, que é definido pelo item 2 da especificação JMS 1.1.

O item 2.2 define os possíveis participantes de uma aplicação JMS:
Cliente JMS - Cliente JMS que utiliza linguagem java.
Cliente não-JMS - Possíveis clientes JMS de uma aplicação escritos utilizando uma linguagem proprietária do provider. Como exemplo pode-se citar um cliente do IBM MQ escrito utilizando uma API proprietária do produto.
Mensagens - Estas são as mensagens postadas e consumidas no MOM(Message Oriented Middleware).
Provider JMS - Este é o MOM em si que pode fornecer serviços adicionais à especificação para seus clientes, como é o caso da maioria dos providers.
Objetos Administrativos - São objetos pré-configurados no provider para facilitar a vida dos clientes, usualmente os objetos são ConnectionFactory e Destinations, estes objetos são registrados na árvore JNDI do servidor por default ou pelos administradores do MOM utilizado.

O modelo de Administração definido é o que proporciona interoperabilidade das aplicações escritas em JMS, isso porque os objetos ConnectionFactory e Destinations são padronizados e as APIs de acesso a estes recursos, fornecidas usualmente pelos providers, disponibilizam interfaces padrão para sua utilização.
ConnectionFactory - Objeto utilizado por clientes para criar uma conexão com o provider utilizado.
Destination - Objeto que o cliente usa para especificar o destino de envio ou recebimento de mensagens.
Estes objetos devem ser disponibilizados na árvore JNDI(Java Naming and Directory Interface) do servidor(JNDI Namespace), possibilitando acesso padronizado através da API padrão de java. Conforme imagem abaixo tirada da especificação JMS 1.1.


Conforme mencionado anteriormente existem dois tipos de mensagens que podem ser utilizadas conforme a especificação: Point-to-Point ou Publish/Subscriber Messages.

A especificação define então algumas APIs que possibilitam a utilização do tipo de mensagem desejado e ainda um conjunto de interfaces que abstrai essa implementação, conforme o quadro abaixo, retirado da especificação, ilustra.



Segue uma breve definição dos objetos da interface comum:

ConnectionFactory - Objeto administrativo utilizado pelo cliente para criar uma conexão com o provider.
Connection - uma conexão estabelecida com o provider.
Destination - um destino de envio ou recebimento de mensagens.
Session - um contexto criado com o provider para envio ou recebimento de mensagens.
MessageProducer - Um objeto criado por uma sessão que efetivamente é utilizado apra envio de mensagens ao destino.
MessageConsumer - Um objeto criado por uma sessão que é utilizado para consumir mensagens de um destino.

Conforme já foi mencionado, outros serviços não definidos pela especificação podem ser adicionados pelo fornecedor do provider e portanto, os modos de Administração, segurança, timers, dentre outros serviços, podem ser proprietários e definidos através de APIs de cada fornecedor do MOM(provider).


Na questão de acesso concorrente, a tabela mostrada abaixo, retirada da especificação, ilustra bem o modelo utilizado.



A especificação prevê ainda um modelo de Request/Reply para as mensagens poderem definir um estado de conversação. Para isso, é definido no header das mensagens um campo denominado JMSCorrelationID que pode ser utilizado para este fim.


[]s

18 de jan. de 2010

Postgres SQL no Linux - Dicas úteis

Neste artigo estou reunindo informações úteis para um quickstart de Postgres com Linux, se vc estiver usando uma versão que use o yum ao invés do apt-get basta substituir o comando. As versões utilizadas nestes comandos são Postgres 8.4 e Ubuntu 9.10.

Os comandos devem ser dados utilizando um terminal do ubuntu.

Instalação da base de dados Postgres:
sudo apt-get install postgresql


Instalação da ferramenta de administração pgAdmin III:
sudo apt-get install pgadmin3


Iniciar o postgresql
sudo service postgresql start


Para cadastrar uma senha default do usuário postgres ou resetar a senha deste usuário que é o superusuário da base de dados utilizar:
sudo su postgres
Com o usuário do postgres no terminal execute o psql para conectar na base de dados de senhas do postgres e modificá-la:
psql -d template1
O terminal irá mostrar o console postgres:
#template1
Dê um alter table no terminal modificando a senha:
ALTER USER postgres WITH PASSWORD '${SUA_NOVA_SENHA}';

Para sair do console do postgres utilize \q no terminal conectado.

Caso seja necessário alterar permissão de acesso para a base criada deve-se editar o arquivo de configuração do postgres que por default fica no caminho: /etc/postgresql/8.4/main/pg_hba.conf no ubuntu e no red hat usualmente no /var/lib/pgsql

Reiniciar o postgres:
sudo /etc/init.d/postgresql-8.4 restart



Se quiser parar o postgresql:
sudo service postgresql stop

[]s

13 de jan. de 2010

Weblogic JMS - Parte I - Overview de JMS

Comecei a revisar os conceitos de JMS do weblogic e por isso irei fazer uma série de postagens resumindo estes conceitos. A fonte principal de consulta para estes artigos será a especificação oficial da sun para JMS 1.1 e a documentação oficial de JMS do Oracle Weblogic Server 10.3.

JMS provê uma maneira padronizada para programas java criarem, enviarem, receberem e lerem mensagens de sistemas coorporativos de mensageria como Weblogic JMS Server, IBM MQ Series, Apache Active MQ dentre vários outros. A especificação provê então uma forma para comunicar com qualquer destes ambientes abstraídos de seu fornecedor, bastando, para isso, que o "Message Oriented Middleware" - Middleware orientado a mensagens escolhido implemente a especificação JMS 1.1 que é a abordada neste artigo.

JMS provê um conjunto de interfaces e padrões que definem como um cliente acessa os recursos de um Produto Orientado a Mensagens.

JMS prevê dois tipos básicos de mensagens "point-to-point" e "publish-subscribers". As mensagens point-to-point são mensagens enviadas para uma fila onde apenas um cliente irá publicar e somente um cliente irá receber e processar a mensagem, no modelo publish-subscriber é utilizado um tópico onde vários clientes podem se registrar para publicar e receber as mensagens. Para melhor ilustrar estes modelos basta pensarmos em um ambiente de call center por exemplo que é similar ao modelo point-to-point pois quando um atendente pega a ligação do usuário é feita uma ligação entre dois pontos. Já no modelo publish-subscriber é um modelo parecido com uma lista de discussão ou grupo da internet, onde um ou vários clientes podem postar uma mensagem que será recebida por todos os clientes que estiverem associados aquela lista. Posteriormente entrarei em mais detalhes e exemplos dos dois modelos.

O item 1.2.4 da especificação JMS 1.1 detalha um item bastante importante, listando os itens que não são definidos na especificação e que, portanto, cada fornecedor de produtos de mensageria implementam de forma proprietária ou em muitos casos nem fornece o serviço. Este itens incluem: Serviços de balanceamento de carga e tolerância à falhas, Notificação ou aviso de erros e problemas, Administração, Monitoramento, Segurança e Protocolo de comunicação. O Weblogic Server 10 possui todos estes serviços que podem ser considerados adicionais à especificação, mas que são fundamentais em um produto com qualide de serviços aceitáveis para grandes corporações.

O item 1.4 da especificação define que algumas APIs tem que ser compatíveis e possível de serem utilizadas em uma implementação JMS, e portanto todos os produtos que forem compatíveis com a especificação devem suportar os padrões: JDBC, componentes JavaBeans, EJB, JTA, JTS, JNDI e Java EE.

Neste primeiro artigo fiz um resumo do item 1 da especificação JMS 1.1 destacando seus principais pontos. No próximo irei tratar do modelo de arquitetura do JMS 1.1 que é definido no item 2 da especificação.

[]s

29 de set. de 2009

Scrum e ferramentas gratuitas - Pronto Agile

Em um projeto em que estou trabalhando foi definido que iríamos utilizar o modelo do scrum para realizar acompanhamento de projetos da equipe.
A equipe em questão não é uma equipe de desenvolvimento de software e portanto precisamos encontrar uma ferramenta que possa ser adaptada para a nossa realidade que é mais relacionadas a planejamento de ambiente e suporte a ambiente de produção. Com isso em mente comecei uma avaliação de várias ferramentas que dão suporte ao processo de desenvolvimento de software com XP e Scrum para avaliar a que seria a de mais fácil customização para adotarmos no nosso dia a dia. As ferramentas que avaliei foram:
XPlanner, IceScrum, Scarab e o Pronto.

Dentre estas a que mais agradou e que vamos customizar para atender à nossa demanda foi o Pronto. Os principais pontos que fizeram com que utilizássemos o Pronto é sua facilidade de configuração, open source, simples e também por ser um projeto de Brasileiros.

Durante a configuração de nosso ambiente seguimos as instruções de download e instalação no site do Pronto para baixar os fontes e gerar nosso ambiente.

Durante o processo de configuração do ambiente conforme descrito na documentação do pronto, ocorre um erro ao tentar executar um comando do maven como por exemplo: mvn eclipse:eclipse ou mvn package O erro é causado pois existe uma dependência documentada no pom.xml do projeto e que não é encontrada que é a do bliki.wiki . Este pacote vem junto com a distribuição de códigos-fonte do pronto e encontra-se sob o diretório WEB-INF/lib . A versão que vem distribuída é a 3.0.11 e a referência no pom.xml é para a 3.0.13. Para corrigir o problema temos 2 opções. O primeiro passo para ambas as situações é corrigir a referência do pom para a versão 3.0.11 então onde está no pom.xml a entrada:

       info.bliki.wiki
       bliki-core
       3.0.13
  


Deve ser corrigido para referenciar a versão 3.0.11 que vem com os fontes do pronto. Com isso a entrada no pom.xml fica assim:

 
       info.bliki.wiki
       bliki-core
       3.0.11
  


Feito isso temos duas opções, a primeira é instalar manualmente o pacote utilizando o comando do maven para tal e a segunda é encontrar um repositório que contenha as bibliotecas e registrá-la no nosso pom.xml. Procurei na web e não encontrei um repositório maven com a biblioteca do bliki.wiki em questão e por isso estou disponibilizando no meu repositório na internet. Para baixar essa lib do repositório basta registrar no pom.xml do projeto(entre as tags build e dependencies) o repositório com a seguinte entrada:


    
         maweb
         http://www.maweb.com.br/mvn_repo
    



Com isso o arquivo pom.xml do pronto completo fica assim:



 4.0.0
 pronto-agile
 pronto-agile
 war
 Pronto!
 1.0.0
 http://www.bluesoft.com.br/pronto

 
  
   
   
    maven-compiler-plugin
    
     1.6
     1.6
     iso-8859-1
     true
    
   
  
 
 
  
   maweb
   http://www.maweb.com.br/mvn_repo
  
 
 
  
   org.hibernate
   hibernate
   ${hibernate.version}
   
    
     ejb
     javax.persistence
    
    
     jta
     javax.transaction
    
   
   provided
  

  
   org.hibernate
   hibernate-commons-annotations
   ${hibernate.commons.annotations.version}
  

  
   dom4j
   dom4j
   1.6.1
   provided
  

  
   org.hibernate
   hibernate-annotations
   ${hibernate.annotations.version}
   
    
     ejb
     javax.persistence
    
   
   provided
  

  
   log4j
   log4j
   ${log4j.version}
   provided
  

  
   cglib
   cglib
   ${cglib.version}
   provided
  

  
   commons-fileupload
   commons-fileupload
   1.2.1
  

  
   commons-codec
   commons-codec
   1.3
  

  
   commons-io
   commons-io
   1.4
  

  

  
   json-lib
   net.sf.json-lib
   0.9
  

  
   org.springframework
   spring-core
   2.5.6
  

  
   org.springframework
   spring-web
   2.5.6
  
  

  
   org.springframework
   spring-aop
   2.5.6
  

  
   org.springframework
   spring-webmvc
   2.5.6
  

  
   org.springframework
   spring-jdbc
   2.5.6
  

  
   hsqldb
   hsqldb
   1.8.0.7
  

  
   org.springframework
   spring-orm
   2.5.6
  

  
   junit
   junit
   4.4
   test
  

  
   javax.servlet
   jstl
   1.1.2
  

  
   taglibs
   standard
   1.1.2
  

  
   opensymphony
   sitemesh
   ${sitemesh.version}
  

  
   javax.mail
   mail
   ${javamail.version}
   provided
  

  
   javax.servlet
   jsp-api
   ${jsp.version}
   provided
  

  
   javax.servlet
   servlet-api
   ${servlet.version}
   provided
  

  
   com.google.collections
   google-collections
   1.0-rc2
  
        
        
            info.bliki.wiki
            bliki-core
            3.0.11
        
        
        
 

 
  3.2.1.ga
  3.0.0.ga
  3.0.0.ga
  3.2.5.ga
  2.2.1
  1.4
  2.4
  2.0
  2.1_3
  1.2.14
 



Após estas alterações os comandos do maven já irão funcionar corretamente como por exemplo:
mvn eclipse:eclipse - irá gerar arquivos de projeto para ser importado pelo eclipse. Se der algum erro tente rodar mvn eclipse:clean e então o mvn eclipse:eclipse
mvn package - gera um .war do projeto no diretório targets.

Pronto!

[]s

15 de set. de 2009

Gzip no Weblogic

Outro dia precisei que as aplicações rodando em weblogic server utilizassem recursos de compactação Gzip para conteúdos de texto, html, css e javascript. O Gzip compacta estes recursos para transimtir pela internet e posteriormente o browser descompacta o que pode aumentar sensivelmente a performance percebida pelo usuário final da aplicação em diversos casos.

No ambiente em questão o weblogic está configurado para servir também o conteúdo estático e neste caso a solução padrão no mundo java é utilizar a configuração por Filtros.

Felizmente já existe um filtro Open Source disponibilizado para o weblogic para este fim e por isso basta configurarmos o pacote para utilizá-lo. Segue um passo-a-passo.

1) Baixar o .jar com as classes do filtro Gzip que vc preferir ou então escrever e gerar seu .jar com o filtro. Se preferir utilizar um filtro já escrito seguem links com posts e código fonte para tal. Links em inglês. blog do Markus Eisele ou blog do Nagesh Susarla. Se você preferir desenvolver o seu filtro de compactação Gzip pode se basear em artigos já escritos a respeito filtros, gzip e performance no On Java, no JavaWorld ou no Java Boutique, dentre outros.

2) O segundo passo é configurar o seu filtro no web.xml da apliação web que irá utilizar o Gzip, essa configuração deve variar um pouco depedendo do filtro que for ser utilizado conforme mencionado no passo 1, portanto segue um exemplo meramente ilustrativo abaixo:


  

    GZIPFilter

    weblogicx.servlet.gzip.filter.GZIPFilter

  



  

  

    GZIPFilter

    /*.html

  



  

    GZIPFilter

    /*.htm

  



  

    GZIPFilter

    /*.log

  

  

  

    GZIPFilter

    /*.txt

  



Finalmente, para checar a compactação utilizo o web developer toolbar do firefox em Information > View Document Size mostra a compactação de cada recurso carregado em uma página. Ver exemplo nas 2 imagens abaixo(ilustrativo).

Outra possibilidade é utilizar o plugin do Apache para Weblogic Server e habilitar a configuração de compactação do Apache para recursos estáticos. []s