[Resolvido] Dúvida usando @SessionScoped no VRaptor 3 com Tomcat 7

8 respostas
Andre_Brito

E aí galera!

Estou construindo uma app pra testes, usando o VRaptor. O esquema é o seguinte: tenho um objeto que é anotado com SessionScoped e Component. Simples assim, certo?

Pois bem, até ontem próximo do meio dia, não conseguia fazer funcionar com o Pico. O objeto não fica preso na sessão, nem com reza braba! Tentei reiniciar a máquina, reinstalar o Tomcat, dezipar o Eclipse, re-configurar o build path. Testei tudo o que pude. Quando comecei a escrever um e-mail pra alguem da equipe de desenvolvimento do VRaptor achando que era algum bug em relação ao Pico, pensei em trocar pro Google Guice. Bingo! Funcionou.

Código vai, código vem e cheguei num ponto que tive que fazer novamente um objeto SessionScoped e Component. Nesse momento eu estava usando Google Guice. O problema ocorreu novamente! O objeto simplesmente não fica na sessão (por um momento achei que o objeto que falei anteriormente, ao mudar do Pico pro Guice, também não estava. Testando com o outro objeto, ele estava! Ou seja, um objeto fica na sessão e o outro não).

Por isso, minha dúvida: existe alguma forma de logar, a cada request, os objetos que estão na sessão? Usando um filter, por exemplo, pra todas as urls, eu poderia pegar esses objetos que estão na sessão X (SessionScoped, ApplicationScoped, seja lá qual for) e mostrar no console mesmo, só por fins de debug. Existe alguma forma de fazer isso?

Existe alguma relação com poder ficar no cache do servidor / navegador? Mesmo eu reiniciando a máquina e trocando de browser?

E, só pra aproveitar o tópico: alguém mais teve algum problema parecido? Estou usando Eclipse 6, Firefox 4, Ubuntu 11.04, VRaptor (última versão), MySQL 5 e Tomcat 7. Me recomendam mudar de Tomcat pra Jetty?

Abraço!

8 Respostas

Lucas_Cavalcanti

vc pode imprimir os atributos da HttpSession… todos os objetos sessionScoped tem que estar lah (isso vale pra Guice e Spring só)

Enumeration<String> e = session.getAttributeNames();

while(e.hasMoreElements()) {
   syso(session.getAttribute(e.next());
}
Lucas_Cavalcanti

ah, imprima tb o session.getId(), pra saber se vc tá lidando com a mesma sessão

Andre_Brito

Valeu Lucas! Vou testar isso amanhã a noite.

[Editado daqui pra baixo]
Aliás, Lucas, de onde pego o session? Se eu estiver dentro de uma classe filter, eu consigo?

[Editado]
Acho que entendi. Devo usar o HttpSession que será injetado na Filter, certo?

Lucas_Cavalcanti

se vc usar um Interceptor do VRaptor ao inves de um Filter vc pode receber a HttpSession no construtor

Andre_Brito
Lucas, ficou perfeito. Código a seguir, se algum dia alguém precisar disso:
import java.util.Enumeration;

import javax.servlet.http.HttpSession;

import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.resource.ResourceMethod;

@Intercepts
public class SessionScopeInterceptor implements Interceptor {

	private final HttpSession session;

	public SessionScopeInterceptor(HttpSession session) {
		this.session = session;
	}

	@Override
	public boolean accepts(ResourceMethod method) {
		return true;
	}

	@Override
	public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException {
		System.err.println("Apresentando os Sessions da Sessao " + session.getId());
		Enumeration<String> e = session.getAttributeNames();

		while (e.hasMoreElements()) {
			System.err.println(session.getAttribute(e.nextElement()));
			System.err.println();
		}

		stack.next(method, resourceInstance);
	}
}
Andre_Brito

Lucas, você sabe me dizer se perco muita performance interceptando todas as requisições? Esse sistema que estou fazendo é pequeno, 3, 4 máquinas acessando. Acho que não deve passar de 100 mil requests por dia.

Mas e num sistema com, sei lá, 1 milhão de requests por dia? A dupla Tomcat7/VRaptor aguenta o tranco?

Lucas_Cavalcanti

depende mto do que vc faz no interceptor…

se o interceptor faz operações rápidas/constantes não impacta mto na performance…

só cuidado que gerar toString de objetos pode ser custoso, então imprimir todos os objetos que estão na sessão em todas as requisições pode ser caro

Lucas_Cavalcanti

VRaptor+Tomcat 7 pode aguentar sim 1M request por dia, principalmente se estiver usando Guice ou Pico como container, se as transações estiverem sendo controladas corretamente, se o pool de conexões com o banco estiver configurado corretamente, se os parâmetros do servidor estiverem tunados corretamente

ou seja, dá pra fazer sim, só tem que usar as coisas certas

Criado 30 de maio de 2011
Ultima resposta 1 de jun. de 2011
Respostas 8
Participantes 2