开发者

Channel API closes a channel

First off, thank you @Moishe for the very useful API. I'm having a little timeout problem, maybe someone knows the answer. Here's how I open the channel:

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();

This works fine, I post my messages and they go to the other clients pretty quickly. But if I stay on the page for roughly 15 minutes, the server loses track of my channel. In dev, it throws an error (which I saw was a known bug: http://www.mail-archive.com/google-appengine@googlegroups.com/msg44609.html). But in prod, it still ignores messages on that channel after about 15 minutes.

We fixed it by adding a setInterval(getSomeUrl, everyMinute) to the page, but we'd rather not have to do that. I noticed in Moishe's last commit for the trivia game sample that he took out a keep-alive. I didn't understand how he replaced it, and what he meant by onopen is reliable:

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

Update: Server side code is

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 is 开发者_JAVA百科just a base class I use for all my GAE handlers, it provides checkUser which redirects if the user isn't logged in, and it provides writeTemplate which takes what's in self.model and writes it in a template. It's just a proof of concept, so no cache or anything else other than what's above.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜