É possível usar WebSocket com VRaptor?

27 respostas
alexandref93

Olá, minha dúvida é se é possível usar WebSocket junto com o VRaptor? ou é uma implementação separada? Eu vi na página do apache tomcat, porém lá diz que a implementação do WebSocket não está finalizada ainda, porém queria saber se existe outra alternativa para implementar o WebSocket no tomcat 7.

Obrigado desde já!

27 Respostas

Lucas_Cavalcanti

a implementação que já funciona é a do Jetty 8, se eu não me engano…

o problema é que o vraptor é implementado usando um Filter e essa implementação se baseia numa Servlet assíncrona. o que dá pra tentar fazer é criar uma versão do filtro do VRaptor em servlet…

quer tentar fazer?

alexandref93

Quero sim, isso vai influenciar em desempenho ou coisa do genero?

Lucas_Cavalcanti

trocar de Filter pra Servlet? Não.
trocar de Filter pra AsyncServlet? Talvez. Mas provavelmente nada muito significativo.

alexandref93

Mas isso soh com jetty 8 certo?

Lucas_Cavalcanti

sim, pq só ele tem o suporte estável ao WebSocket…

alexandref93

Aham, e você possui algum artigo ou tutorial para implementar para o VRaptor?

alexandref93

Aham, e você possui algum artigo ou tutorial para implementar para o VRaptor?

Lucas_Cavalcanti

http://vraptor.caelum.com.br/pt/docs/como-contribuir/

Mas no caso vc vai ter que fazer uma versão dessa classe:

que ao invés de implements Filter terá que estender HttpServlet (ou AsyncServlet se eu não me engano)

tudo que tá no doFilter vc pode colocar no método service da servlet.

daí talvez vc tenha que fazer alguma coisa pro async funcionar, mas vc pode fazer esse primeiro passo, se funcionar a gente tenta adaptar pro async.

Por favor faça isso nun fork do VRaptor:

Abraços

alexandref93

Eu poderia tentar implementar essa versão do async, para por exemplo mais pra frente criar um @ResourceAsync vamos supor!

Lucas_Cavalcanti

Sim!!! \o/

alexandref93

Só que no caso dae só funcionaria com o Jetty por enquanto certo?

Lucas_Cavalcanti

se vc usar a API do Servlet 3 pra async, funcionaria em qqer servidor java que suporta isso :wink:

alexandref93

blz, vou tentar fazer a implementação, qualquer dúvida retorno aqui!

Lucas_Cavalcanti

commite lá no github, daí eu consigo te dar uns toques durante o desenvolvimento :wink:

me passa o link do seu fork!

alexandref93

https://github.com/alexandref93/vraptor

não sei se vai dá tempo tudo hoje, mas pretendo finalizar essa semana!

alexandref93

Cara fiquei meio na dúvida quanto a implementação, tipo tentando seguir mais ou menos isso http://blog.caelum.com.br/websockets-html5-em-java-com-jetty-web-em-tempo-real/
só que parece que fica meio preso ao Jetty =s

Lucas_Cavalcanti

sim… esse é preso ao jetty…

mas tenta fazer o do servlet 3:

https://blogs.oracle.com/enterprisetechtips/entry/asynchronous_support_in_servlet_3

tá em ingles, mas é algo na linha de usar:

@WebServlet(url="/foo" asyncSupported=true)

e

AsyncContext aCtx = req.startAsync(req, res);

daí dá pra fazer alguma coisa…

não tenho certeza se ele vai usar webSockets pra isso, mas é algo nessa linha.

alexandref93

Agora não sei como vou tratar FilterChain já que com HttpServlet não vem ele…

Lucas_Cavalcanti

é só não usar o filterChain… remove esse código.

isso é pra continuar a requisição caso ela não seja tratável pelo vraptor (tipo imagens e javascripts)

alexandref93

Posso remover tranquilamente essa duas linhas:

staticHandler.deferProcessingToContainer(chain, baseRequest, baseResponse);
final RequestInfo request = new RequestInfo(servletContext, chain, mutableRequest, mutableResponse);

Acredito que nesse último caso, porém é necessário um FilterChain…

Lucas_Cavalcanti

passa null por enquanto no segundo

alexandref93

Commitei lá a primeira parte, porém ainda não terminei, se quiser sugerir alguma coisa já!

alexandref93

Logo mais tarde, vou está fazendo as alterações que você comentou, porém fiquei na dúvida como vou fazer para diferenciar de um Resource para um ResourceAsync…

Lucas_Cavalcanti

talvez tenha que mudar o ExecuteMethodInterceptor pra executar o método dentro do async…

talvez vc precise do AsyncContext pra conseguir implementar o método do controller, então vc precisa injetar na classe de algum jeito… isso é que pode definir o que é assíncrono e o que não é…

talvez tb seja suficiente fazer um ComponentFactory de AsyncContext

alexandref93

Fiz mais algumas alterações, teria algum exemplo para mudar o ExecuteMethodInterceptor?

Lucas_Cavalcanti

tenta fazer o da component factory primeiro, e tenta escrever um controller normal que recebe o AsyncContext no construtor e faz uma operação assíncrona.

bglbruno

alexandref93, conseguiu implementar?
Eu estou com a mesma necessidade.
Se não implementou, gostaria de continuar essa ideia.

Criado 3 de setembro de 2012
Ultima resposta 9 de mai. de 2013
Respostas 27
Participantes 3