Gostaria de saber se já implementaram algo com websockets + vraptor.
A minha necessidade é fazer um server websocket, que quando um objeto é inserido/alterado/removido na base de dados via hibernate, quero que o server emita uma mensagem broadcast e tal, notificando os usuários.
Alguém já implementou algo assim?
Pode me dar uma ajuda?
Já vi como implementar no Tomcat 7, mas ele usa uma Servet, e pelo que andei lendo aqui no Guj, terei problemas porque o VRaptor usa um Filter.
Pois eh… uma tentativa que talvez funcione é pegar o filtro do VRaptor:
e trocar o implements Filter por extends HttpServlet…
o que vai dar pau é a falta do FilterChain… mas tente usar sem por enquanto e ver no que rola.
Daí eu te ajudo a resolver os problemas que aparecerem =)
bglbruno
Certo Lucas, eu vi as dicas que você deu num outro tópico sobre isso
E fiz dessa maneira. Eu não conheço muito sobre servlets
@WebServletpublicclassVRaptorServletextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;privateContainerProviderprovider;privateServletContextservletContext;privateStaticContentHandlerstaticHandler;privatestaticfinalLoggerlogger=LoggerFactory.getLogger(VRaptor.class);publicvoiddestroy(){provider.stop();provider=null;servletContext=null;}@Overrideprotectedvoidservice(HttpServletRequestreq,HttpServletResponseres)throwsServletException,IOException{if(!(reqinstanceofHttpServletRequest)||!(resinstanceofHttpServletResponse)){thrownewServletException("VRaptor must be run inside a Servlet environment. Portlets and others aren't supported.");}finalHttpServletRequestbaseRequest=(HttpServletRequest)req;finalHttpServletResponsebaseResponse=(HttpServletResponse)res;if(staticHandler.requestingStaticFile(baseRequest)){staticHandler.deferProcessingToContainer(null,baseRequest,baseResponse);}else{logger.debug("VRaptor received a new request");logger.trace("Request: {}",req);VRaptorRequestmutableRequest=newVRaptorRequest(baseRequest);VRaptorResponsemutableResponse=newVRaptorResponse(baseResponse);finalRequestInforequest=newRequestInfo(servletContext,null,mutableRequest,mutableResponse);provider.provideForRequest(request,newExecution<Object>(){publicObjectinsideRequest(Containercontainer){container.instanceFor(EncodingHandler.class).setEncoding(baseRequest,baseResponse);container.instanceFor(RequestExecution.class).execute();returnnull;}});logger.debug("VRaptor ended the request");}super.service(req,res);}@Overridepublicvoidinit(ServletConfigcfg)throwsServletException{servletContext=cfg.getServletContext();BasicConfigurationconfig=newBasicConfiguration(servletContext);init(config.getProvider());logger.info("VRaptor 3.4.1-SNAPSHOT successfuly initialized");}voidinit(ContainerProviderprovider){this.provider=provider;this.provider.start(servletContext);this.staticHandler=provider.getContainer().instanceFor(StaticContentHandler.class);}}
Eu só não consegui compreender ainda, como essa servlet passaria a requisição via ws pra a classe servidor de websocket.
Pois esse seria o papel dela, correto? ou estou enganado?
Outra dúvida, no método service, preciso chamar super.service(req, res) no final?
Lucas_Cavalcanti
não era só fazer algo como request.getAsyncContext() no controller que vc quiser brincar de fazer WebSocket?
bglbruno
Não sei cara rs sério, não manjo nada de servlet.
Como seria o cenário?
Eu teria um controller que seria meu server websocket e essa servlet faria o mesmo papel do filtro do vraptor.
Ou essa servlet adaptada já seria o meu server?
To com muita vontade de implementar isso e contribuir com o projeto vraptor, mas não sei muito como seria.
Não sei muito bem como prosseguir.
Se puder me passar algo ou me ajudar, seria bom.
Lucas_Cavalcanti
o servlet vai funcionar como se fosse o filter do vraptor e o controller vai ser o servidor do web socket.
Nunca usei isso na prática, então não sei se vou conseguir te ajudar mto… mas procura sobre o request asyncContext
bglbruno
Saquei.
Está dando esse erro quando tento acessar a raiz da aplicação
@Overrideprotectedvoidservice(HttpServletRequestreq,HttpServletResponseres)throwsServletException,IOException{if(!(reqinstanceofHttpServletRequest)||!(resinstanceofHttpServletResponse)){thrownewServletException("VRaptor must be run inside a Servlet environment. Portlets and others aren't supported.");}finalHttpServletRequestbaseRequest=(HttpServletRequest)req;finalHttpServletResponsebaseResponse=(HttpServletResponse)res;if(!staticHandler.requestingStaticFile(baseRequest)){logger.debug("VRaptor received a new request");logger.trace("Request: {}",req);VRaptorRequestmutableRequest=newVRaptorRequest(baseRequest);VRaptorResponsemutableResponse=newVRaptorResponse(baseResponse);finalRequestInforequest=newRequestInfo(servletContext,null,mutableRequest,mutableResponse);provider.provideForRequest(request,newExecution<Object>(){publicObjectinsideRequest(Containercontainer){container.instanceFor(EncodingHandler.class).setEncoding(baseRequest,baseResponse);container.instanceFor(RequestExecution.class).execute();returnnull;}});AsyncContextaCtx=req.startAsync(req,res);//nãoseiondechamaressemétodologger.debug("VRaptor ended the request");}}
Alguma ideia?
Lucas_Cavalcanti
vc deve estar ou deployando num servidor que não é servlet 3.0 ou vc tá com a api do servlet 2.5 no classpath.
bglbruno
É isso mesmo Lucas. Viajei, tava deployando o projeto no tomcat 6
Só não estou conseguindo subir o tomcat 7 no eclipse.
Fica dando essa mensagem: “[…] bootstrap.jar which is referenced by the classpath, does not exist.” Sendo que o arquivo existe.
Já tentei reinstalar o server no eclipse, mexer no User Entries, e nada.
Já teve esse problema?
Lucas_Cavalcanti
vc tá usando o adapter do tomcat 7? tipo na hora de criar o servidor vc selecionou a versão 7?
bglbruno
Sim, isso mesmo. new Server -> Selecionei a versão, diretório de instalação, etc.
bglbruno
Lucas, consegui instalar o server corretamente.
Agora quando tento acessar um controller pela url, não é mostrado nada na tela.
Meu método service está da mesma forma:
@Overrideprotectedvoidservice(HttpServletRequestreq,HttpServletResponseres)throwsServletException,IOException{if(!(reqinstanceofHttpServletRequest)||!(resinstanceofHttpServletResponse)){thrownewServletException("VRaptor must be run inside a Servlet environment. Portlets and others aren't supported.");}finalHttpServletRequestbaseRequest=(HttpServletRequest)req;finalHttpServletResponsebaseResponse=(HttpServletResponse)res;if(!staticHandler.requestingStaticFile(baseRequest)){logger.debug("VRaptor received a new request");logger.trace("Request: {}",req);VRaptorRequestmutableRequest=newVRaptorRequest(baseRequest);VRaptorResponsemutableResponse=newVRaptorResponse(baseResponse);finalRequestInforequest=newRequestInfo(servletContext,null,mutableRequest,mutableResponse);provider.provideForRequest(request,newExecution<Object>(){publicObjectinsideRequest(Containercontainer){container.instanceFor(EncodingHandler.class).setEncoding(baseRequest,baseResponse);container.instanceFor(RequestExecution.class).execute();returnnull;}});AsyncContextaCtx=req.startAsync(req,res);//nãoseioquefazercomissologger.debug("VRaptor ended the request");}}