渠道API关闭渠道

时间:2011-06-11 14:54:24

标签: google-app-engine channel-api

首先,感谢@Moishe提供非常有用的API。我有一点暂停问题,也许有人知道答案。以下是我打开频道的方式:

var openChannel = function () {
    var channel = new goog.appengine.Channel($('#token').val());
    var socket = channel.open();
    socket.onopen = function () {};
    socket.onmessage = function (m) {
        var message = JSON.parse(m.data);
        // do stuff
    };
    socket.onerror = function (error) { alert(error); };
    socket.onclose = openChannel;
};
openChannel();

这很好用,我发布我的消息,他们很快就会转到其他客户端。但如果我在页面上停留大约15分钟,服务器就会丢失我的频道。在dev中,它会抛出一个错误(我看到这是一个已知错误:http://www.mail-archive.com/google-appengine@googlegroups.com/msg44609.html)。但是在推出时,它仍然会在大约15分钟后忽略该频道上的消息。

我们通过向页面添加setInterval(getSomeUrl, everyMinute)来修复它,但我们宁愿不必这样做。我注意到在Moishe最后一次提交琐事游戏样本时,他发现了一个保持活力。我不明白他是如何取代它的,以及他对onopen的意思是可靠的:

http://code.google.com/p/trivia-quiz/source/browse/trunk/src/index.html

更新:服务器端代码为

class Home(BaseHandler):
    def get(self):
        self.checkUser()

        if self.user:
            userId = self.user.user_id()
            token = channel.create_channel(userId)
            chatClients[userId] = token
            self.model['token'] = token
            players = self.checkChatRoom()
            self.model['users'] = players
            self.model['messages'] = map(lambda k:db.get(k), self.chat_room.messages) # TODO: Replace this line and the next with a query
            self.model['messages'] = sorted(self.model['messages'], key=lambda m: m.timestamp, reverse=True)
            self.writeTemplate('index.html')

BaseHandler只是我用于所有GAE处理程序的基类,它提供checkUser,如果用户未登录则会重定向,并提供writeTemplate,其中包含在self.model中并将其写入模板中。它只是一个概念证明,因此没有缓存或除上述内容之外的任何其他内容。

0 个答案:

没有答案