2012-03-12 61 views
1

我在写一个使用Atmosphere插件的Grails应用程序。这个连接可以工作,但每次我在浏览器中更新页面时,我都会看到我的Web服务器添加了一个新的守护程序线程,这个线程从未被释放。断开Grails中的大气插座

线程数达到200后,Web服务器冻结。

似乎没有文档解释什么是正确的方式来处理与Atmosphere插件的资源(断开连接)?

我的客户端代码执行此操作:

var connectedEndpoint = null; 

$(function() 
{ 
function callback(response) 
{ 
    if (response.transport != 'polling' && response.state != 'connected' && response.state != 'closed') { 
     if (response.status == 200) { 
      eval(response.responseBody); 
     } 
    } 
} 

$.atmosphere.subscribe('${resource(dir: '/atmosphere/channel')}', callback, $.atmosphere.request = {transport: 'streaming'}); 
connectedEndpoint = $.atmosphere.response; 

}); 

$(window).unload(function() 
{ 
    $.atmosphere.unsubscribe(); 
    connectedEndpoint = null; 
}); 

我用在服务器端的气氛的处理程序;

package demo 

import javax.servlet.http.HttpServletRequest 
import javax.servlet.http.HttpServletResponse 
import org.atmosphere.cpr.AtmosphereHandler 
import org.atmosphere.cpr.AtmosphereResource; 
import org.atmosphere.cpr.AtmosphereResourceEvent; 

class DemoController implements AtmosphereHandler<HttpServletRequest, HttpServletResponse> { 

@Override 
public void destroy() { 
    println "destroy" 
} 

@Override 
public void onRequest(AtmosphereResource<HttpServletRequest, HttpServletResponse> event) throws IOException 
{ 
    event.suspend() 
} 

@Override 
public void onStateChange(AtmosphereResourceEvent<HttpServletRequest, HttpServletResponse> event) throws IOException 
{ 
    if (event.isSuspended()) 
    { 
     event.resource.response.writer.with { 
      def message = event.message 
      write "set${message.paramName}(\"${message.id}\",\"${message.value}\");" 
      flush() 
     } 
    } 
} 
} 

处理程序的destroy功能不会被调用!

下图显示我有23个线程在运行。当我开始我的应用程序时,其中大约有6个,每次按F5时都会添加它们!如果我禁用大气新线程不添加,所以这个问题是与大气有关。 (我在Windows7上使用SpringSource工具套件)。

Daemon threads

如果溶液是不平凡的我希望详细的一步一步的指示或一个例子。

UPDATE:部署在Tomcat中我有以下每个错误超过20秒:

Apr 02, 2012 2:35:15 PM org.apache.catalina.startup.HostConfig deployDescriptor 
INFO: Deploying configuration descriptor host-manager.xml 
Apr 02, 2012 2:35:16 PM org.apache.catalina.startup.HostConfig deployDescriptor 
INFO: Deploying configuration descriptor manager.xml 
Apr 02, 2012 2:35:16 PM org.apache.catalina.startup.HostConfig deployDirectory 
INFO: Deploying web application directory docs 
Apr 02, 2012 2:35:16 PM org.apache.catalina.startup.HostConfig deployDirectory 
INFO: Deploying web application directory examples 
Apr 02, 2012 2:35:17 PM org.apache.catalina.startup.HostConfig deployDirectory 
INFO: Deploying web application directory ROOT 
Apr 02, 2012 2:35:17 PM org.apache.coyote.http11.Http11AprProtocol start 
INFO: Starting Coyote HTTP/1.1 on http-8080 
Apr 02, 2012 2:35:17 PM org.apache.coyote.ajp.AjpAprProtocol start 
INFO: Starting Coyote AJP/1.3 on ajp-8009 
Apr 02, 2012 2:35:17 PM org.apache.catalina.startup.Catalina start 
INFO: Server startup in 11401 ms 
2012-04-02 14:41:17,122 [http-8080-39] ERROR cpr.AsynchronousProcessor - failed 
to timeout resource AtmosphereResourceImpl{, hasCode-1035775543, 
[email protected], 
broadcaster=org.atmosphere.cpr.DefaultBroadcaster, 
[email protected], 
serializer=null, 
isInScope=true, 
useWriter=true, 
listeners=[]} 
2012-04-02 14:42:15,034 [http-8080-69] ERROR cpr.AsynchronousProcessor - failed 
to timeout resource AtmosphereResourceImpl{, hasCode-58082012, 
[email protected], 
broadcaster=org.atmosphere.cpr.DefaultBroadcaster, 
[email protected], 
serializer=null, 
isInScope=true, 
useWriter=true, 
listeners=[]} 
2012-04-02 14:44:41,159 [http-8080-13] ERROR cpr.AsynchronousProcessor - failed 
to timeout resource AtmosphereResourceImpl{, hasCode648226529, 
[email protected], 
broadcaster=org.atmosphere.cpr.DefaultBroadcaster, 
[email protected], 
serializer=null, 
isInScope=true, 
useWriter=true, 
listeners=[]} 

.... 

回答

1

萨吕,

您使用该Web服务器?听起来像WebServer在浏览器关闭连接时不会侦测到。您可以添加,在web.xml,下面超时检测

org.atmosphere.cpr.CometSupport.maxInactiveActivity = 30000 //30秒

让我知道如何去。

A +

- Jeanfrancois

+0

不幸的是,它不起作用:'没有这样的属性:类:org的maxInactiveActivity。atmosphere.cpr.CometSupport' – conceptacid 2012-03-13 09:19:15

+0

我的web服务器是tomcat。 – conceptacid 2012-03-13 09:23:48

0

我相信你的问题是你卸载事件。 “$(窗口).unload”。至少我知道,在卸载或卸载事件之前,你无法做很多事情。因此,您的浏览器可能永远不会触发取消订阅()。如果你看到Atmospheres jquery pubsub样本,你可以在连接前看到退订, function connect(){ unsubscribe();} ...

您可以编码循环来检查广播公司,通过推送微不足道的数据来定期验证广播公司是否正在清理。我需要更多的研究气氛,希望有更好的解决方案。希望您可以在刷新创建新连接时清理线程,并让旧用户在用户离开时使用会话过期。

+0

感谢您的关注!我不认为它是取消订阅:我试图通过单击按钮明确调用取消订阅。我认为这个问题在某种程度上与Tomcat servlet在SpringSource Tool Suite中运行的环境Grails + AtmospherePlugin绑定,或者至少与Grails + Tomcat绑定。后来,我决定通过简单地将我的所有网站结构更改为ajax来解决这个问题(幸运的是,这只是一个小型演示而不是真正的产品),但最终我尝试使用Jetty 8,并使用Jetty 8监控网络资源jmx控制台 - 问题没有被观察到! – conceptacid 2012-04-24 07:52:53

+0

我们在Wicket + Atmosphere + Tomcat组合中遇到了完全相同的问题 - 所以它看起来像Tomcat + Atmosphere(连接器的默认设置 - BlockingIOCometSupport) – 2014-02-26 13:01:13