使用grails事件推送插件未发生websocket连接

使用grails事件推送插件未发生websocket连接,grails,atmosphere,Grails,Atmosphere,我正在尝试集成grails事件推送插件来将事件推送到浏览器,但它不起作用。我为它做了以下更改 BuildConfig.groovy grails.tomcat.nio = true compile ":events-push:1.0.M7" events.push.servlet.initParams = [ 'org.atmosphere.cpr.cometSupport': 'org.atmosphere.container.Tomcat7CometSupport',

我正在尝试集成grails事件推送插件来将事件推送到浏览器,但它不起作用。我为它做了以下更改

BuildConfig.groovy

 grails.tomcat.nio = true
 compile ":events-push:1.0.M7"
events.push.servlet.initParams = [
        'org.atmosphere.cpr.cometSupport': 'org.atmosphere.container.Tomcat7CometSupport',
        "org.atmosphere.cpr.CometSupport.maxInactiveActivity": "100000"
 ]

  tomcat.nio=true
Config.groovy

 grails.tomcat.nio = true
 compile ":events-push:1.0.M7"
events.push.servlet.initParams = [
        'org.atmosphere.cpr.cometSupport': 'org.atmosphere.container.Tomcat7CometSupport',
        "org.atmosphere.cpr.CometSupport.maxInactiveActivity": "100000"
 ]

  tomcat.nio=true
从META-INF文件夹中删除了context.xml(由插件生成),因为tomcat无法使用它

在客户端,即

window.grailsEvents = new grails.Events('http://localhost:8080');
我成功地启动了我的应用程序。我还在下面的日志中留言

DEBUG cpr.DefaultBroadcaster  - Broadcaster eventsbus doesn't have any associated resource. Message will be cached in the configured BroadcasterCache
Bu在浏览器websocket中打开应用程序时不工作。 在发球端我看到下面的米塞奇

2014-05-01 15:19:56,365 [http-nio-8080-exec-3] DEBUG cpr.AsynchronousProcessor  - Timing out the connection for request AtmosphereRequest{ contextPath= servletPath=/g-eventsbus pathInfo=/eventsbus requestURI=/g-eventsbus/eventsbus requestURL=http://localhost:8080/g-eventsbus/eventsbus destroyable=false}
2014-05-01 15:19:56,366 [http-nio-8080-exec-3] WARN  websocket.DefaultWebSocketProcessor  - Unable to retrieve AtmosphereResource for org.apache.catalina.websocket.WsOutbound@269dd750
2014-05-01 15:19:57,783 [http-nio-8080-exec-5] DEBUG cpr.AsynchronousProcessor  - Timing out the connection for request AtmosphereRequest{ contextPath= servletPath=/g-eventsbus pathInfo=/eventsbus requestURI=/g-eventsbus/eventsbus requestURL=http://localhost:8080/g-eventsbus/eventsbus destroyable=false}
我明白了

WebSocket connection to 'ws://localhost:8080/g-eventsbus/eventsbus?X-Atmosphere-tracking-id=0&X-Atmosphere-Framework=1.1.0.beta3&X-Atmosphere-Transport=websocket&X-Atmosphere-TrackMessageSize=true&X-Cache-Date=0&topics=eventsbus' failed: WebSocket is closed before the connection is established. 

伙计们,请帮帮我,我一直在努力使用这个插件。

我使用的是grails事件推送,几乎所有东西都运行良好。 在BuildConfig中:

grails.servlet.version = "3.0"
grails.tomcat.nio=true
...
dependencies {
    ...
    compile 'org.grails.plugins:events:1.0.0.BUILD-SNAPSHOT'
    compile 'org.atmosphere:atmosphere-runtime:2.1.4'
}

plugins {
...
    build ":tomcat:7.0.52.1"
    runtime ":events-push:1.0.0.BUILD-SNAPSHOT"
}
您必须创建一个文件来声明您的事件:我的文件是EasyRestaurantEvents.groovy

import static reactor.event.selector.Selectors.*

includes = ['push']

doWithReactor = {
    reactor('grailsReactor'){
        ext 'browser', [
            (R('oneMessage-([0-9]+)')) : true
        ]
    }

    reactor('browser'){
        ext 'browser', [
            'oneMessageFromBrowser' : true
        ]
    }
}
在控制器或服务中,我可以通过以下方式发送事件:

event('oneMessage-' + someId, mapObject)
grailsEvents.on("oneMessage-666",
     function(event){
         alert("oneMessage was received for client 666");
     });
import reactor.spring.annotation.ReplyTo
import reactor.spring.annotation.Selector

class OneService {

    @Selector(reactor = 'browser')
    @ReplyTo
    def oneMessageFromBrowser(Map data){
        //do some work
    }
}
在客户端应用程序中,我可以通过以下方式接收此消息:

event('oneMessage-' + someId, mapObject)
grailsEvents.on("oneMessage-666",
     function(event){
         alert("oneMessage was received for client 666");
     });
import reactor.spring.annotation.ReplyTo
import reactor.spring.annotation.Selector

class OneService {

    @Selector(reactor = 'browser')
    @ReplyTo
    def oneMessageFromBrowser(Map data){
        //do some work
    }
}
在服务器应用程序中,我可以通过以下方式从浏览器接收消息:

event('oneMessage-' + someId, mapObject)
grailsEvents.on("oneMessage-666",
     function(event){
         alert("oneMessage was received for client 666");
     });
import reactor.spring.annotation.ReplyTo
import reactor.spring.annotation.Selector

class OneService {

    @Selector(reactor = 'browser')
    @ReplyTo
    def oneMessageFromBrowser(Map data){
        //do some work
    }
}
要从浏览器发送事件,您可以执行以下操作:

grailsEvents.send('oneMessageFromBrowser', {message:'hello from browser'});
我希望这有帮助!我和这个插件斗争了很多=( 但是非常容易使用(当你让它工作时)

PS:我使用angular中创建的另一个应用程序与服务器通信,因此我必须手动导入js:

"atmosphere.js": 2.1.5-javascript
"jquery.atmosphere.js": 2.1.5-jquery

感谢mpccolorado的回复。我发现它可以正常工作,实际上问题是在JS grails中。事件应该用globalTopicName创建

var grailsEvents = new grails.Events(GRAILS_EVENT_URL, {globalTopicName: 'newReview'});

真的,谢谢你,我已经挣扎了好几个小时了!我知道这已经一年了,但是…你能解释一下为什么你知道要做“doWithReactor”吗东西,如果它被记录在某个地方?插件的文档根本没有提到这一点:/Stephen Maldini在互联网上的一些视频,我再也找不到了……但我强烈建议你尝试另一个类似的插件,因为事件推送插件被放弃了。