gpt4 book ai didi

comet - Play! 的 Comet 支持如何工作?

转载 作者:行者123 更新时间:2023-12-03 21:19:34 24 4
gpt4 key购买 nike

我看到 Akka 模块的描述说 Play有很好的 Comet 支持,但我从未使用过 Comet之前,我在 Play 的文档中找不到任何提及。它在 Play 中是如何工作的?

我花了两天多的时间来解决这个问题,所以我想与其他 Play 初学者分享这些信息。

最佳答案

Play 包含一个示例聊天应用程序,它演示了如何使用 Comet。这个例子并没有解释发生了什么,所以这就是我想出的。

模型

为了让其他人找到您发送的新更新,它们需要存储在某个地方。可以想象,这可能在缓存中,甚至在 Controller 本身中,但数据库将是最安全的选择,因此您需要一个模型。他们还需要一种方法来确定哪些更新对他们来说是新的,这意味着您可能需要一个日期字段(另请参见:Last update timestamp with JPA)。 Chat 示例使用一个简单的模型:

@Entity
public class Message extends Model {
public String user;
public Date date;
public String text;

public Message(String user, String text) {
this.user = user;
this.text = text;
this.date = new Date();
}
}

Controller

Controller 需要两种方法来方便 Comet。一个发布新数据的地方,它没有做任何特别的事情:
public static void postMessage(String message) {
new Message(session.get("nick"), message).save();
}

一个用于检索更新:
public static void newMessages() {
List<Message> messages = Message.find("date > ?", request.date).fetch();
if (messages.isEmpty()) {
suspend("1s");
}
renderJSON(messages);
}

这里的关键位是 suspend("1s")这就是保持 HTTP 请求打开的原因,每秒检查一次新数据。

看法

View 有三个职责——发送新数据,获取更新,然后渲染这些更新。

发送,就像相应的 Controller Action 一样,没有做任何特别的事情:
$('#send').click(function(e) {
var message = $('#message').val();
$('#message').val('');
$.post('@{postMessage()}', {message: message});
});

获取更新是神奇的一点:
// Retrieve new messages
var getMessages = function() {
$.ajax({
url: '@{newMessages()}',
success: function(messages) {
$(messages).each(function() {
display(this);
});
},
complete: function() {
getMessages();
},
dataType: 'json'
});
}
getMessages();
getMessages()被调用一次以开始工作,然后在每次成功请求后递归调用自身。它得到 newMessages()查找新消息的操作,如果没有任何消息,它将保持请求打开,直到它有要报告的内容。找到新消息时,会将 JSON 数据传递给 display功能:
var display = function(message) {
$('#thread').append(tmpl('message_tmpl', {message: message}));
}
display函数应用 JavaScript Micro-Template到 JSON 数据以呈现新消息。不需要使用微模板,但它确实工作得很好。它们包含在将要使用它们的页面的模板中:
<script type="text/html" id="message_tmpl">
<div class="message <%= message.user == '${session.nick}' ? 'you' : '' %> <%= message.user == 'notice' ? 'notice' : '' %>">
<h2><%= message.user %></h2>
<p><%= message.text.replace('\n', '<br/>') %></p>
</div>
</script>
type="text/html"导致浏览器、搜索引擎和屏幕阅读器忽略整个 script堵塞。结果比使用 jQuery 构建节点或连接字符串更容易阅读和维护。总的来说,一旦您知道哪些位是相关的,它就非常简单。

关于comet - Play! 的 Comet 支持如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4511853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com