SpringMVC整合websocket实现消息推送及触发功能
本文为大家分享了SpringMVC整合websocket实现消息推送,供大家参考,具体内容如下
1.创建websocket握手协议的后台
(1)HandShake的实现类
/** *ProjectName:price *FileName:HandShake.java *PackageName:com.yun.websocket *Date:2016年9月3日下午4:44:27 *Copyright(c)2016,578888218@qq.comAllRightsReserved. */ packagecom.yun.websocket; importjava.util.Map; importorg.springframework.http.server.ServerHttpRequest; importorg.springframework.http.server.ServerHttpResponse; importorg.springframework.http.server.ServletServerHttpRequest; importorg.springframework.web.socket.WebSocketHandler; importorg.springframework.web.socket.server.HandshakeInterceptor; /** *Title:HandShake
*Description: *@Company:青岛励图高科
*@author:刘云生 *@version:v1.0 *@since:JDK1.7.0_80 *@Date:2016年9月3日下午4:44:27
*/ publicclassHandShakeimplementsHandshakeInterceptor{ @Override publicbooleanbeforeHandshake(ServerHttpRequestrequest,ServerHttpResponseresponse,WebSocketHandlerwsHandler, Mapattributes)throwsException{ //TODOAuto-generatedmethodstub StringjspCode=((ServletServerHttpRequest)request).getServletRequest().getParameter("jspCode"); //标记用户 //StringuserId=(String)session.getAttribute("userId"); if(jspCode!=null){ attributes.put("jspCode",jspCode); }else{ returnfalse; } returntrue; } @Override publicvoidafterHandshake(ServerHttpRequestrequest,ServerHttpResponseresponse,WebSocketHandlerwsHandler, Exceptionexception){ //TODOAuto-generatedmethodstub } }
(2)MyWebSocketConfig的实现类
/** *ProjectName:price *FileName:MyWebSocketConfig.java *PackageName:com.yun.websocket *Date:2016年9月3日下午4:52:29 *Copyright(c)2016,578888218@qq.comAllRightsReserved. */ packagecom.yun.websocket; importjavax.annotation.Resource; importorg.springframework.stereotype.Component; importorg.springframework.web.servlet.config.annotation.EnableWebMvc; importorg.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; importorg.springframework.web.socket.config.annotation.EnableWebSocket; importorg.springframework.web.socket.config.annotation.WebSocketConfigurer; importorg.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; /** *Title:MyWebSocketConfig
*Description: *@Company:青岛励图高科
*@author:刘云生 *@version:v1.0 *@since:JDK1.7.0_80 *@Date:2016年9月3日下午4:52:29
*/ @Component @EnableWebMvc @EnableWebSocket publicclassMyWebSocketConfigextendsWebMvcConfigurerAdapterimplementsWebSocketConfigurer{ @Resource MyWebSocketHandlerhandler; @Override publicvoidregisterWebSocketHandlers(WebSocketHandlerRegistryregistry){ //TODOAuto-generatedmethodstub registry.addHandler(handler,"/wsMy").addInterceptors(newHandShake()); registry.addHandler(handler,"/wsMy/sockjs").addInterceptors(newHandShake()).withSockJS(); } }
(3)MyWebSocketHandler的实现类
/** *ProjectName:price *FileName:MyWebSocketHandler.java *PackageName:com.yun.websocket *Date:2016年9月3日下午4:55:12 *Copyright(c)2016,578888218@qq.comAllRightsReserved. */ packagecom.yun.websocket; importjava.io.IOException; importjava.util.HashMap; importjava.util.Iterator; importjava.util.Map; importjava.util.Map.Entry; importorg.springframework.stereotype.Component; importorg.springframework.web.socket.CloseStatus; importorg.springframework.web.socket.TextMessage; importorg.springframework.web.socket.WebSocketHandler; importorg.springframework.web.socket.WebSocketMessage; importorg.springframework.web.socket.WebSocketSession; importcom.google.gson.GsonBuilder; /** *Title:MyWebSocketHandler
*Description: *@Company:青岛励图高科
*@author:刘云生 *@version:v1.0 *@since:JDK1.7.0_80 *@Date:2016年9月3日下午4:55:12
*/ @Component publicclassMyWebSocketHandlerimplementsWebSocketHandler{ publicstaticfinalMapuserSocketSessionMap; static{ userSocketSessionMap=newHashMap (); } @Override publicvoidafterConnectionEstablished(WebSocketSessionsession)throwsException{ //TODOAuto-generatedmethodstub StringjspCode=(String)session.getHandshakeAttributes().get("jspCode"); if(userSocketSessionMap.get(jspCode)==null){ userSocketSessionMap.put(jspCode,session); } for(inti=0;i<10;i++){ //broadcast(newTextMessage(newGsonBuilder().create().toJson("\"number\":\""+i+"\""))); session.sendMessage(newTextMessage(newGsonBuilder().create().toJson("\"number\":\""+i+"\""))); } } @Override publicvoidhandleMessage(WebSocketSessionsession,WebSocketMessage>message)throwsException{ //TODOAuto-generatedmethodstub //Messagemsg=newGson().fromJson(message.getPayload().toString(),Message.class); //msg.setDate(newDate()); //sendMessageToUser(msg.getTo(),newTextMessage(newGsonBuilder().setDateFormat("yyyy-MM-ddHH:mm:ss").create().toJson(msg))); session.sendMessage(message); } @Override publicvoidhandleTransportError(WebSocketSessionsession,Throwableexception)throwsException{ //TODOAuto-generatedmethodstub if(session.isOpen()){ session.close(); } Iterator >it=userSocketSessionMap .entrySet().iterator(); //移除Socket会话 while(it.hasNext()){ Entry entry=it.next(); if(entry.getValue().getId().equals(session.getId())){ userSocketSessionMap.remove(entry.getKey()); System.out.println("Socket会话已经移除:用户ID"+entry.getKey()); break; } } } @Override publicvoidafterConnectionClosed(WebSocketSessionsession,CloseStatuscloseStatus)throwsException{ //TODOAuto-generatedmethodstub System.out.println("Websocket:"+session.getId()+"已经关闭"); Iterator >it=userSocketSessionMap .entrySet().iterator(); //移除Socket会话 while(it.hasNext()){ Entry entry=it.next(); if(entry.getValue().getId().equals(session.getId())){ userSocketSessionMap.remove(entry.getKey()); System.out.println("Socket会话已经移除:用户ID"+entry.getKey()); break; } } } @Override publicbooleansupportsPartialMessages(){ //TODOAuto-generatedmethodstub returnfalse; } /** *群发 *@Title:broadcast *@Description:TODO *@param:@parammessage *@param:@throwsIOException *@return:void *@author:刘云生 *@Date:2016年9月10日下午4:23:30 *@throws */ publicvoidbroadcast(finalTextMessagemessage)throwsIOException{ Iterator >it=userSocketSessionMap .entrySet().iterator(); //多线程群发 while(it.hasNext()){ finalEntry entry=it.next(); if(entry.getValue().isOpen()){ newThread(newRunnable(){ publicvoidrun(){ try{ if(entry.getValue().isOpen()){ entry.getValue().sendMessage(message); } }catch(IOExceptione){ e.printStackTrace(); } } }).start(); } } } /** *给所有在线用户的实时工程检测页面发送消息 * *@parammessage *@throwsIOException */ publicvoidsendMessageToJsp(finalTextMessagemessage,Stringtype)throwsIOException{ Iterator >it=userSocketSessionMap .entrySet().iterator(); //多线程群发 while(it.hasNext()){ finalEntry entry=it.next(); if(entry.getValue().isOpen()&&entry.getKey().contains(type)){ newThread(newRunnable(){ publicvoidrun(){ try{ if(entry.getValue().isOpen()){ entry.getValue().sendMessage(message); } }catch(IOExceptione){ e.printStackTrace(); } } }).start(); } } } }
2.创建websocket握手处理的前台
3.通过Controller调用进行websocket的后台推送
/** *ProjectName:price *FileName:GarlicPriceController.java *PackageName:com.yun.price.garlic.controller *Date:2016年6月23日下午3:23:46 *Copyright(c)2016,578888218@qq.comAllRightsReserved. */ packagecom.yun.price.garlic.controller; importjava.io.IOException; importjava.util.Date; importjava.util.List; importjavax.annotation.Resource; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpSession; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.stereotype.Controller; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RequestMethod; importorg.springframework.web.bind.annotation.ResponseBody; importorg.springframework.web.context.request.RequestContextHolder; importorg.springframework.web.context.request.ServletRequestAttributes; importorg.springframework.web.servlet.ModelAndView; importorg.springframework.web.socket.TextMessage; importcom.google.gson.GsonBuilder; importcom.yun.common.entity.DataGrid; importcom.yun.price.garlic.dao.entity.GarlicPrice; importcom.yun.price.garlic.model.GarlicPriceModel; importcom.yun.price.garlic.service.GarlicPriceService; importcom.yun.websocket.MyWebSocketHandler; /** *Title:GarlicPriceController
*Description: * *@Company:青岛励图高科
*@author:刘云生 *@version:v1.0 *@since:JDK1.7.0_80 *@Date:2016年6月23日下午3:23:46
*/ @Controller publicclassGarlicPriceController{ @Resource MyWebSocketHandlermyWebSocketHandler; @RequestMapping(value="GarlicPriceController/testWebSocket",method={RequestMethod.POST,RequestMethod.GET},produces="application/json;charset=utf-8") @ResponseBody publicStringtestWebSocket()throwsIOException{ myWebSocketHandler.sendMessageToJsp(newTextMessage(newGsonBuilder().create().toJson("\"number\":\""+"GarlicPriceController/testWebSocket"+"\"")),"AAA"); return"1"; } }
4.所用到的jar包
org.springframework spring-websocket 4.0.1.RELEASE
5.运行的环境
至少tomcat8.0以上版本,否则可能报错
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。