0

我在我的 grails 应用程序中使用 Atmosphere。从我的 IDE(IntelliJ Idea)运行应用程序时,一切都很好。但是当我将它部署到tomcat(7.0)时出现异常:

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)

web.xml 中的 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 中触发的事件。

4

2 回答 2

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

于 2013-07-19T09:01:52.317 回答
0

通常为了使 Atmosphere 与 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>

也许这就是问题所在……

于 2013-07-09T12:33:36.207 回答