使用Grails实现服务器发送事件

3
我们希望创建一个聊天应用,用户输入一些文本后,其他用户可以看到这些内容。 Ext.Ajax.request 是通过Ajax向服务器发送数据的函数。
以下是在Sencha Architect 3中的代码:
var panel = button.up();
var input = panel.getComponent("inputField");
console.debug("Message: " + input.getValue());


Ext.Ajax.request({
    url: '/Chat/chatMain/send',
    params: {
        message: input.getValue()
    },
    success: function(response){
        console.log("Message successfully send.");
    },
    failure: function(response){
        console.log("ERROR!");
        console.log('server-side failure with status code ' + response.status);
    }
});

Grails中的聊天控制器:

class ChatMainController {

    def send(){ 
    //code for sending data back to client
    //params.message contains message from browser it should be broadcast
    //with server-side events
    //event('sms', data) // will trigger registered browsers on 'sms' topic
    }
}

以下示例将接收从Grails应用程序发送的服务器发送事件:

以下示例将接收从 Grails 应用程序发送的服务器发送事件:

var source = new EventSource('/Chat/chatMain/receive');

source.addEventListener('sms', showSms, false);

source.onmessage = function (event) {
  // a message without a type was fired
  showSms(event);
};

function showSms(e){
    console.log(e.data);
}

我们发现了Grails插件Atmosphere和Events Push,但是示例中只展示了Websockets而没有服务器端事件。我们不知道如何使用Events Push插件从Grails服务器广播文本。有人能帮忙吗?

2
这是一个事件推送插件的示例。它可能会有所帮助。 - Alidad
Grails邮件列表上有一场长时间的讨论。也许那里的信息可以帮到你:http://grails.1312388.n4.nabble.com/Server-Push-HowTo-td4641344.html - matejk
1个回答

0

您可以在Grails服务中发送服务器事件。 插件页面显示了一个示例

MyService.groovy

//will receive client events from 'saveTodo' topic
@Listener(namespace='browser') saveTodo(Map data){
  //...
  // will trigger registered browsers on 'savedTodo' topic
  event([namespace: 'browser', topic: 'savedTodo', data: data]) 
}

要在客户端接收此内容,您需要引入插件模块:

<r:require module="grailsEvents"/>
<r:script>
  var grailsEvents = new grails.Events("http://localhost:8080/app/");
  grailsEvents.send('saveTodo', data); //will send data to server topic 'saveTodo'
  //will listen for server events on 'savedTodo' topic
  grailsEvents.on('savedTodo', function(data){...}); 
</r:script>

data参数是来自服务器事件的响应。

请确保查看文档链接中的Tomcat配置,这是一个重要的步骤。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接