2013-07-08 111 views
0

我在我的Grails應用程序使用大氣。從我的IDE(IntelliJ Idea)運行應用程序時,每件事情都很好。但是當我把它部署到Tomcat(7.0)以下異常引發:在web.xmlAtmosphereFramework異常java.lang.IllegalStateException:不支持

2013-07-08 09:07:19,118 [ajp-nio-8009-exec-13] ERROR cpr.AtmosphereFramework - AtmosphereFramework exception 
java.lang.IllegalStateException: Not supported. 
    at org.atmosphere.cpr.AtmosphereRequest.startAsync(AtmosphereRequest.java:594) 
    at org.atmosphere.container.Servlet30CometSupport.suspend(Servlet30CometSupport.java:138) 
    at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:104) 
    at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.doService(Tomcat7Servlet30SupportWithWebSocket.java:65) 
    at org.atmosphere.container.TomcatWebSocketUtil.doService(TomcatWebSocketUtil.java:87) 
    at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.service(Tomcat7Servlet30SupportWithWebSocket.java:61) 
    at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1571) 
    at org.atmosphere.cpr.AtmosphereServlet.doPost(AtmosphereServlet.java:176) 
    at org.atmosphere.cpr.AtmosphereServlet.doGet(AtmosphereServlet.java:162) 
    at com.googlecode.psiprobe.Tomcat70AgentValve.invoke(Tomcat70AgentValve.java:38) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 

myservlet配置爲:

<servlet> 
     <description>MeteorServlet</description> 
     <servlet-name>MeteorServlet</servlet-name> 
     <servlet-class>org.grails.plugin.platform.events.push.GrailsMeteorServlet</servlet-class> 
     <init-param> 
      <param-name>org.atmosphere.cpr.broadcaster.shareableThreadPool</param-name> 
      <param-value>true</param-value> 
     </init-param> 
     <init-param> 
      <param-name>org.atmosphere.cpr.broadcaster.maxProcessingThreads</param-name> 
      <param-value>20</param-value> 
     </init-param> 
     <init-param> 
      <param-name>org.atmosphere.cpr.broadcaster.maxAsyncWriteThreads</param-name> 
      <param-value>20</param-value> 
     </init-param> 
     <load-on-startup>0</load-on-startup> 
     <async-supported>true</async-supported> 
    </servlet> 

使用率

var receivedOrders = new Array(); 
    var grailsEvents = new grails.Events("${rootPath}", 
    { 
     transport: 'sse', 
     fallbackTransport: 'long-polling', 
     timeout: 10000, 
     onMessage: function(data){ 
      try{ 
       if(data.responseBody.length > 0){ 
        var order = jQuery.parseJSON(data.responseBody).body; 
        if(order.id){ 
         if (receivedOrders.indexOf(order.id) == -1) { 
         receivedOrders[receivedOrders.length] = order.id; 
         var url = "<g:createLink controller="orderAdministration" action="orderNotification"/>"; 
         $.ajax({ 
          type: "POST", 
          url: url, 
          data: { id: order.id } 
         }).done(function (response) { 
            if (response != "0") { 
             $.msgGrowl({ 
              type: 'info', sticky: true, 'title': '${message(code: 'order.notification.title')}', 'text': response, lifetime: 5000 
             }); 
            } 
           }); 
         } 
        } 
       } 
      } catch (e) { 
       // Atmosphere sends commented out data to WebKit based browsers 
      } 
     } 
    }); 

    grailsEvents.on('order_event', function(data){}); 

似乎有些事情是錯誤與tomcat配置。任何想法?

編輯:

我測試。但不起作用。

問題發生,因爲我已經在grails.Events提供的選項。 通過更改爲此,異常解決。

var receivedOrders = new Array(); 
    var grailsEvents = new grails.Events("${rootPath}"); 

    function handleOrderEvent(data){ 
     try{ 
      if(data.id){ 
       if (receivedOrders.indexOf(data.id) == -1) { 
        receivedOrders[receivedOrders.length] = data.id; 
        var url = "<g:createLink controller="orderAdministration" action="orderNotification"/>"; 
        $.ajax({ 
         type: "POST", 
         url: url, 
         data: { id: data.id } 
        }).done(function (response) { 
         if (response != "0") { 
          $.msgGrowl({ 
           type: 'info', sticky: true, 'title': '${message(code: 'order.notification.title')}', 'text': response, lifetime: 5000 
          }); 
         } 
        }); 
       } 
      } 
     }catch (e) { 
     // Atmosphere sends commented out data to WebKit based browsers 
     } 
    } 

    grailsEvents.on('order_event', handleOrderEvent, {transport:'long-polling', fallbackTransport:'polling'}); 

但仍然沒有事件傳播到客戶端!

我在tomcat的前面的Apache網絡服務器。事件在服務中被觸發,但不在JavaScript中。

回答

1

有來自JF Arcand(該Atmospehere框架的創建者)的其他響應: http://atmosphere-framework.2306103.n4.nabble.com/org-apache-catalina-connector-Request-startAsync-Not-Supported-td4651994.html

你要麼需要在web.xml中添加

<servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class> 
<async-supported>true</async-supported> 

啓用的Servlet 3.0,或添加

<init-param> 
     <param-name>org.atmosphere.useNative</param-name> 
     <param-value>true</param-value> 
    </init-param> 

由於async-supported已經定義,你應該嘗試設置org.atmosphere.useNative爲true

0

通常爲與Tomcat的環境中工作(V6 - 我不知道在Tomcat 7),我更改了server.xml中的連接器協議(HTTP/1.1〜HttpNio)是這樣的:

<Service name="Catalina"> 
    <!--  
    <Connector port="8080" address="xxx.xxx.xxx.xxx" protocol="HTTP/1.1" ..../> 
    --> 
    <!-- 
    HTTP 1.1 protocol is replaced with org.apache.coyote.http11.Http11NioProtocol 
    --> 
    <Connector port="8080" address="xxx.xxx.xxx.xxx" protocol="org.apache.coyote.http11.Http11NioProtocol" /> 
    ... 
    </Service> 

也許這就是問題所在...

+0

它已經配置是這樣的。不工作 –