2012-03-12 3 views
1

Я пишу приложение Grails, которое использует плагин Atmosphere. Соединение работает, но каждый раз, когда я обновляю страницу в браузере, я вижу, что мой веб-сервер добавляет новый поток Daemon, который впоследствии не выпускается.Отсоединение разъемов атмосферы в Grails

После того, как количество потоков достигает 200, веб-сервер замерзает.

Кажется, нет документации, объясняющей, как правильно обращаться с ресурсами (отключить) от плагина 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! Если отключить атмосферу, новые потоки не добавляются, поэтому эта проблема связана с атмосферой. (Я использую SpringSource Tools Suite в Windows7).

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

Salut,

которые WebServer вы используете? Звук, подобный WebServer, не обнаруживается, когда браузер закрывает соединение. Вы можете добавить в web.xml, следующий Таймаут детектор

org.atmosphere.cpr.CometSupport.maxInactiveActivity = 30000 // 30 секунд

Позволь мне знать, как она идет.

A +

- Jeanfrancois

+0

К сожалению, это не работает: 'Нет такого свойства: maxInactiveActivity для класса: org.atmosphere.cpr.CometSupport' – conceptacid

+0

Мой веб-сервер является tomcat. – conceptacid

0

Я считаю, что ваша проблема в вашем случае разгрузки. "$ (Окно) .unload". Я знаю, по крайней мере, в хроме, вы не можете многое сделать в событиях разгрузки или перед загрузкой. поэтому ваш браузер, вероятно, никогда не запускает unsubscribe().

Если вы посмотрите на образец атмосферы jquery pubsub, вы можете увидеть отписку перед подключением, function connect() { unsubscribe(); ...

Вы можете закодировать цикл, чтобы проверить вещательные компании, нажав несущественные данные, чтобы периодически проверять вещателей, если они не очищаются. Мне нужно больше исследовать атмосферу и надеяться на лучшее решение. надеюсь, вы можете очистить потоки, когда новое соединение создается из обновления, и пусть старые истекают с сеансом, когда пользователь уходит.

+0

Спасибо за внимание! Я не думаю, что это отписывается: я попытался вызвать отмену подписки явно, нажав кнопку. Я думаю, что проблема каким-то образом связана с окружающей средой Grails + AtmospherePlugin, запущенной в SpringSource Tool Suite с сервлетом Tomcat, или, по крайней мере, связана с Grails + Tomcat. Позже я решил решить эту проблему, просто изменив всю структуру своего сайта на ajax (к счастью, это была небольшая демонстрация, а не настоящий продукт), но в конце я попытался использовать Jetty 8, и я отслеживаю веб-ресурсы, используя консоль jmx - проблема не наблюдалась! – conceptacid

+0

У нас точно такая же проблема в комбинации Wicket + Atmosphere + Tomcat - так кажется Tomcat + Atmosphere (настройки по умолчанию для разъемов - BlockingIOCometSupport) –

Смежные вопросы