smaldini / grails-events-push

Events Push
Apache License 2.0
67 stars 29 forks source link

AtmosphereFramework exception java.lang.IllegalStateException: Not supported. #43

Open FarzinZaker opened 11 years ago

FarzinZaker commented 11 years ago

I am using Events-Push in my grails application. every thing is fine when running application from my IDE (IntelliJ Idea). but when I deploy it to tomcat (7.0) following exception raises:

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 config in web.xml is:

<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>

usage is

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){});

it seems some thing is wrong with tomcat configuration. any idea?

jpboudreault commented 11 years ago

Did you try with the default transport and fallbackTransport? Could you post your server.xml? Also, check the exact version of tomcat you are using since older 7.0.XXX didn't implement servlet v3.0.

FarzinZaker commented 11 years ago

I have tested it. but does not work.

the problem occured because I have provided options in grails.Events. by changing to this, exception solved.

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'});

but still no event is propagated to client!

I have an apache webserver in front of tomcat. events fired in services but not in javascript.

jpboudreault commented 11 years ago

I cannot help you since I never used long-polling. I can tell you that I had trouble with an apache webserver in front of tomcat with websockets. I had to switch to Nginx or allow access to the tomcat directly.

confile commented 11 years ago

I have the same issue. Would be interested in a solution. I use Tomcat 7.0.42.