问题描述
项目用到了atmosphere框架,采用的是springMVC+atmosphere+c3p0,应用是一个在线聊天系统,可以运行,也做了线上测试,但是有一个bug不知道如何解决,并且现在想着要去做集群,想要了解和交流的欢迎发送邮件给我:75277381@qq.com。如果项目能完善运行,我将会写一遍博客,补充国内在atmosphere文档的空白,谢谢!
解决方案
解决方案二:
什么bug,你不说大家咋知道呢
解决方案三:
没有用过,支持分享
解决方案四:
补充:bug描述,当程序运行一段时间之后,新的请求不会再被激活,一直是一个被压住的状态(suspend)-->对于一个存在的broadcaster(房间),当新建一个broadcaster(新的房间),运行正常。且后台不会报错。
解决方案五:
@RequestMapping(value="/comet",method=RequestMethod.GET)publicModelAndViewsubscribe(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{AtmosphereResourceresource=(AtmosphereResource)request.getAttribute(FrameworkConfig.ATMOSPHERE_RESOURCE);this.doGet(resource,request,resource.getResponse());ModelAndViewmv=newModelAndView(newNoOpView());returnmv;}@RequestMapping(value="/comet",method=RequestMethod.POST)publicModelAndViewbroadcastMessage(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{this.doPost(request,response);ModelAndViewmv=newModelAndView(newNoOpView());returnmv;}protectedvoiddoGet(AtmosphereResourceresource,HttpServletRequestrequest,AtmosphereResponseresponse){response.setContentType("application/json");response.setCharacterEncoding("UTF-8");response.setHeader("Cache-Control","no-cache");response.setHeader("Pragma","no-cache");response.setDateHeader("Expires",0);Stringpath=request.getParameter("path");if(path==null||path.isEmpty()==true){sendError(resource,"");return;}intuserId=0;try{//从当前请求中获取,用户ID}catch(Exceptione){e.printStackTrace();DebugUtil.log("CometuserIderror:");DebugUtil.log(e.toString()+"n"+DebugUtil.getStack(e));}if(userId==0){sendError(resource,"");return;}Integernumber=addUserToroomsource(resource.uuid(),userId,path);Broadcasterbroadcaster=BroadcasterFactory.getDefault().lookup("/"+path,true);resource.setBroadcaster(broadcaster);resource.addEventListener(newmyAtmosphereResourceEventListener());resource.suspend();}privateIntegeraddUserToroomsource(Stringuuid,intuserId,Stringpath){returnnull;}privatevoidsendError(AtmosphereResourceresource,StringerrorMessage){sendError(resource,errorMessage,"");}publicstaticvoidsendError(AtmosphereResourceresource,StringerrorMessage,StringerrorInfo){StringBuilderjson=newStringBuilder("{"result":"");json.append(errorMessage);json.append(""");if(errorInfo!=null){json.append(","message":"");json.append(errorInfo);json.append(""");}json.append("}");Broadcasterb=BroadcasterFactory.getDefault().lookup("/error",true);b.addAtmosphereResource(resource);b.broadcast(json.toString());}protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse){JSONObjectjsonObject=null;Stringpath=null;Stringmessage=null;try{Stringstr=request.getReader().readLine();if(str!=null){jsonObject=newJSONObject(str);}}catch(Exceptione){}if(!jsonObject.isNull("path")){path=jsonObject.getString("path");}if(!jsonObject.isNull("message")){message=jsonObject.getString("message");}AtmosphereResourceresource=(AtmosphereResource)request.getAttribute(ApplicationConfig.SUSPENDED_ATMOSPHERE_RESOURCE_UUID);Broadcasterbroadcaster=BroadcasterFactory.getDefault().lookup("/"+path);if(broadcaster!=null){broadcaster.broadcast(message);}}
解决方案六:
是不是程序判定为房间关闭了。
解决方案七:
引用5楼zhao50632的回复:
是不是程序判定为房间关闭了。
不会,因为新加入该房间的用户才会有一只被压住的情况,已经存在的用户还是可以正常聊天。
解决方案八:
是特定的框架吗?
解决方案:
引用7楼huxiweng的回复:
是特定的框架吗?
特定的框架?什么意思?就是atmosphere框架啊。
解决方案:
检查一下是不是在等待peer回写
解决方案:
引用8楼hujiang716013的回复:
Quote: 引用7楼huxiweng的回复:
是特定的框架吗?特定的框架?什么意思?就是atmosphere框架啊。
光看get/post,没啥问题。
解决方案:
引用10楼huxiweng的回复:
Quote: 引用8楼hujiang716013的回复:
Quote: 引用7楼huxiweng的回复:
是特定的框架吗?特定的框架?什么意思?就是atmosphere框架啊。
光看get/post,没啥问题。
整个程序就是这2个方法,get(请求被压住),post(接受数据,激活被压住的连接--广播)
解决方案:
引用9楼defonds的回复:
检查一下是不是在等待peer回写
我一直在怀疑,是不是源码的什么地方,进入了一个死锁状态。但是不知道如何去测试
解决方案:
不能加断点么。你这是直接部署服务器了?
解决方案:
引用13楼defonds的回复:
不能加断点么。你这是直接部署服务器了?
部署到服务器才会出现BUG,在本地测试,或者访问量很小的情况不会出现。就不知道如何在本地进行模拟访问???
解决方案:
用LoadRunner或者试试。也可以参考下:
解决方案:
引用15楼defonds的回复:
用LoadRunner或者试试。也可以参考下:
都用过了,没有用,LoadRunner11录制脚本,运行的时候会报错,一直会说资源找不到。JMeter只能模拟http请求,不能加载js,因为请求都是js去做的事情
解决方案:
那你自己写脚本模拟用户测吧:
解决方案:
引用17楼defonds的回复:
那你自己写脚本模拟用户测吧:
才疏学浅,
解决方案:
最笨的办法,就是你本机测试做服务器,让同事们访问,然后你就可以断点跟踪了
解决方案:
引用19楼defonds的回复:
最笨的办法,就是你本机测试做服务器,让同事们访问,然后你就可以断点跟踪了
这点访问量恐怕不够,我还是想想自己写脚本,谢谢你的提议。我也与框架作者交流过,一直没找出问题的原因所在,很是困惑。
解决方案:
引用20楼hujiang716013的回复:
Quote: 引用19楼defonds的回复:
最笨的办法,就是你本机测试做服务器,让同事们访问,然后你就可以断点跟踪了这点访问量恐怕不够,我还是想想自己写脚本,谢谢你的提议。我也与框架作者交流过,一直没找出问题的原因所在,很是困惑。
这不一定是框架的问题,现在的问题是你根本就不知道是哪里的问题。
解决方案:
引用21楼defonds的回复:
Quote: 引用20楼hujiang716013的回复:
Quote: 引用19楼defonds的回复:
最笨的办法,就是你本机测试做服务器,让同事们访问,然后你就可以断点跟踪了这点访问量恐怕不够,我还是想想自己写脚本,谢谢你的提议。我也与框架作者交流过,一直没找出问题的原因所在,很是困惑。
这不一定是框架的问题,现在的问题是你根本就不知道是哪里的问题。
我也一直在查找自身代码的原因,只能有一套完整的测试方法了,我才能去判断到底问题在哪里,请问你对tomcat的集群了解如何?
解决方案:
了解一些,这和你遇到的问题有联系么
解决方案:
引用23楼defonds的回复:
了解一些,这和你遇到的问题有联系么
现在考虑做,tomcat集群。但是主站项目的原因,不能与apache集成。现在的设想是N个tomcat集群,如何保证能共享广播数据?RedisBroadcaster这个atmosphere插件用过没?这个就是做集群的广播类,我现在配置上去有点问题,启动项目会报错:java.net.ConnectException:Connectionrefused:connect
解决方案:
你现在的问题不是单主机都不行么?你先解决单主机下的问题,再来问集群下广播数据的共享吧。
解决方案:
引用25楼defonds的回复:
你现在的问题不是单主机都不行么?你先解决单主机下的问题,再来问集群下广播数据的共享吧。
哎,现在是无头苍蝇,求给点意见,我也才出来工作。