Pular para o conteúdo principal

Replicação de sessão com VRaptor 3.5 e Cluster de Tomcat 7

Olá pessoal, hoje vou mostrar detalhes de uma aplicação desenvolvida com VRaptor rodando em um cluster de Tomcat 7.

Características da Aplicação

A aplicação foi desenvolvida utilizando:
  • JDK 6;
  • VRaptor 3.5.3;
    • Spring 3.0.5, como provider de IoC/DI;
  • Banco de dados PostgreSQL.
Características do Ambiente

O ambiente foi projetado com: 
  • Apache Web Server 2.2.22;
    • Sendo responsável pelo balanceamento de carga;
  • Tomcat 7.0.54;
    • JVM versão 6;
    • Sendo este um cluster de 2 nós.
Regras para replicação de sessão em Java EE

Para que possamos trabalhar com cluster em um ambiente Java EE, a aplicação deve seguir algumas regras, que são as seguintes:
  • A aplicação deve ter a tag <distributable /> no deployment descriptor;
  • Todos os dados que serão replicados, devem implementar a interface java.io.Serializable;
  • Para armazenar ou alterar um objeto na sessão, sempre devemos invocar o método setAttribute
Seguindo estas regras, podemos afirmar que aplicação pode funcionar em um ambiente de cluster.

O VRaptor

O VRaptor é um framework utilizado para o desenvolvimento de aplicações web, os principais recursos que o tornam uma ótima escolha para a camada Web Tier são as seguintes:
  • Baseado em REST;
  • Fácil integração com outros frameworks como Spring, Tiles, Velocity, etc;
  • Suporte e documentação;
  • Fácil geração e manipulação de XML e JSON;
  • Possibilidade de troca do provider de IoC/DI.
Observação: Neste tutorial estamos usando a versão 3.5.3 do VRaptor, que utiliza o Google Guice como provider padrão para IoC, atualmente o VRaptor encontra-se na versão 4.0.0, onde seu core foi reescrito e padronizado para utilizar CDI (Context Dependecy Injection), para mais detalhes acesse o site oficial do framework

Tratamento de objetos com @SessionScoped

Em quase todas aplicações web trabalhamos com dados na sessão, seja ele para autenticar um usuário, ou para manter estado em chamadas ao servidor, com VRaptor, podemos marcar uma classe para que tenha seu estado armazenado na sessão, isso acontece com a anotação @SessionScoped.

O Problema

Um dos grandes problemas quando trabalhamos em ambientes clusterizados é a replicação de sessão, quando uma sessão tem seus dados alterados, o contêiner deve replicar esta alteração entre os nós do cluster, assim garantindo a confiabilidade do sistema.

Em nosso exemplo, utilizei o Spring como provider de IoC/DI, assim ele será o responsável por gerenciar a criação e manipulação dos objetos do VRaptor.

Ao realizar o deployment da aplicação tudo acontece normalmente, mas notamos, que ao alterar um objeto marcado como @SessionScoped a alteração mesmo não é replicada entre os nós do cluster.

A Solução 

Para encontrar um solução para o problema, foram executado uma bateria de testes no sistema, para que o motivo dessa falha fosse descoberto, segue os testes:

  • Realizar alteração na sessão invocando diretamente o método setAttribute da classe HttpSession;
  • Manipulação dos listeners HttpSessionAttributeListener, HttpSessionBindingListener e HttpSessionActivationListener pertencentes ao pacote javax.servelet.http.*, com eles seria possível monitorar as alterações nos atributos da sessão e também a migração entre JVMs;
  • Trocar o Spring pelo Google Guice, como do provider de IoC/DI do VRaptor.
Ao realizar o ultimo teste, tivemos um resultado positivo, pois os objetos marcados como @SessionScoped foram replicados entre os nós do cluster, garantindo assim a confiabilidade do sistema.

Para utilizar o Google Guice como provider é muito simples, porque como mencionei acima, ele é o provider padrão utilizado pelo VRaptor 3.5.

Referências sobre as tecnologias utilizadas:

Até a próxima.

Comentários

Postagens mais visitadas deste blog

Utilizando LocalDate, LocalDateTime e LocalTime na Prática

Tudo bem pessoal, hoje iremos avaliar e analisar operações de manipulação de Datas envolvendo a JavaTime API introduzida no Java 8.

Exemplos da java.time API
Já se passaram alguns anos desde o lançamento do Java 8 e mesmo após este período, há empresas que desconhecem o poder da java.time API, esta foi uma nova API de datas introduzida no Java 8 visando resolver problemas que tínhamos com as velhas classes Date e Calendar.

Vamos mostrar vários exemplos práticos do uso da API:
Criação de objetos No exemplo abaixo, estamos criando os objetos para manipulação de datas, perceba que temos 3 tipos, sendo LocalDate para manipular datas, LocalDateTime para manipular data/hora e LocalTime para horas:
LocalDate localDate = LocalDate.now(); LocalDateTime localDateTime = LocalDateTime.now(); LocalTime localTime = LocalTime.now();
Utilizando formatação Aqui realizamos a operação de formatação, perceba que não foi necessário utilizar a classe SimpleDateFormat, que usaríamos em conjunto com D…

Lendo e Manipulando arquivos CSV com Java

Olá hoje veremos como realizar a leitura e manipulação de arquivos CSV com Java, mostrando que as novas versões da plataforma Java deixaram algumas tarefas simples de serem realizadas.

Exemplo de Arquivo Hoje em dia é comum ao realizar integrações ou carga de dados o uso de arquivos CSV, isto porque, este arquivo possui uma estrutura de fácil entendimento e simples de manipular na maioria das plataformas de desenvolvimento.

Para realizar a leitura dos dados vamos manipular um arquivo com as seguintes colunas: namecpfagephone address:

name;cpf;age;phone;address caio;123456789;20;1145223643;AvenidaPaulista vinicius;147852369;18;1125253625;AvenidaManoel sandra;963258741;30;1174587858;RuaTeixeira regina;125478522;40;1145254536;RuaFernando fernando;785245563;42;1145253669;RuaPereira augusto;456123014;50;1125363633;AvenidaPaulinia maria;456123789;10;1125455525;AvenidaNossaSenhora
Para representar os dados em objetos Java iremos utilizar a seguinte classe:

importlombok.AllArgsConstruc…

Versionamento de Banco Dados com Flyway

Olá pessoal, hoje iremos analisar e aprender como realizar o versionamento e gerenciamento das bases de dados relacionais utilizando o framework Flyway.

Versionamento de Banco Dados Ao trabalhar com desenvolvimento de sistemas é comum realizarmos o versionamento, isso porque uma aplicação pode necessitar de correções, novas funcionalidades e evoluções, onde para garantir a compatibilidade e cuidar do seu ciclo de vida, geramos versões onde é especificado quais itens estão presentes em cada release.
Vamos imaginar seguinte cenário: Sistema ERP1.0.0: Entrega dos módulos Financeiro e RH;1.1.0: Entrega do módulo Contas a Receber. Perceba que a ideia é controlar o que cada versão possui de diferente, e para controlar essas mudanças no lado da aplicação existem várias técnicas e ferramentas, mas e para controlar as mudanças no lado do Banco de dados ? 
Para isso podemos utilizar ferramentas de versionamento que ajudam a realizar este controle, a ferramenta que iremos utilizar é o Flyway.
Con…