2013-04-29 102 views
1

我想弄清楚任务队列和通道API。使用通道API接收任务队列中的消息

我有一个进程预计运行> 60秒添加到任务队列时,用户提交表单。这个过程应该在执行时通过通道api发送消息。粗糙的我似乎无法完成这项工作。谁能告诉我为什么SendMessagesHandler不能发送消息到客户端JavaScript?或者也许客户端JavaScript没有正确接收?另外,在日志控制台中我看不到SendMessagesHandlerlogging消息,它只显示磨机INFO ... GETPOST的运行情况。当我写这篇文章时,我意识到我必须在这里进行一个以上的问题,任务会在任务队列中创建,我可以在SDK控制台中看到它,但它似乎只是无休止地运行,我期望它运行大约1m2秒。如果我从SendMessageHandler中取出sleep命令,它会很快运行,甚至可以在SDK控制台中捕获它。

在此先感谢您的帮助。

以下是main.py文件:

#!/usr/bin/env python 
import webapp2 
import os 
import jinja2 
import logging 
from time import sleep 
from google.appengine.api import taskqueue, users, channel 
from google.appengine.ext import db 

class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     user = users.get_current_user() 
     if user: 
      key = self.request.get('key') 
      if not key: 
       key = user.user_id() 
      key_link = 'http://localhost:8080/?key=' + key 
      token = channel.create_channel(key) 
      template_values = {'token': token, 
        'me': user.user_id(), 
        'key': key, 
        'key_link': key_link, 
        'initial_message': 'Nothing to show yet'} 
      template = jinja_environment.get_template('template.html') 
      self.response.out.write(template.render(template_values)) 
     else: 
      self.redirect(users.create_login_url(self.request.uri)) 

    def post(self): 
     key = self.request.get('key') 
     taskqueue.add(url='/sendmessages', params={'key': key}) 
     self.redirect('/') 

class SendMessagesHandler(webapp2.RequestHandler): 
    def post(self): 
     key = self.request.get('key') 
     sleep(2) 
     channel.send_message(key, 'Starting to send messages...') 
     logging.info('Starting to send messages...') 
     i = 0 
     while i < 60: 
      i += 1 
      logging.info('Counter incremented.') 
      channel.send_message(key, 'Counter incemented.') 
      sleep(1) 

jinja_environment = jinja2.Environment(
     loader=jinja2.FileSystemLoader(os.path.dirname(__file__))) 
app = webapp2.WSGIApplication([ 
     ('/', MainHandler), 
     ('/sendmessages', SendMessagesHandler) 
    ], debug=True) 

这里是template.html

<html> 
    <head> 
     <title>Simple Task Queue Channel API</title> 
     <script src='/_ah/channel/jsapi'></script> 
    </head> 
    <body> 
     <script type='text/jacascript'> 
      onOpened = function() {}; 
      onMessage = function(message) { 
       var messageBox = document.getElementById("messageBox"); 
       messageBox.innerHTML = message; 
      }; 
      onError = function() {}; 
      onClose = function() {}; 
      channel = new goog.appengine.Channel('{{token}}'); 
      socket = channel.open(); 
      socket.onopen = onOpened; 
      socket.onmessage = onMessage; 
      socket.onerror = onError; 
      socket.onclose = onClose; 
     </script> 
     <form method="post" action="/"> 
      <input type="text" name="key" value="{{ key }}"> 
      <input type="submit" name="submit" value="Receive Messages"> 
     </form> 
     <div id="messageBox"><!-- message should go in here --></div> 
    </body> 
</html> 

下面是从浏览器中查看源:

<html> 
<head> 
    <title>Simple Task Queue Channel API</title> 
    <script src='/_ah/channel/jsapi'></script> 
</head> 
<body> 
    <script type='text/jacascript'> 
     onOpened = function() {}; 
     onMessage = function(message) { 
      var messageBox = document.getElementById("messageBox"); 
      messageBox.innerHTML = message; 
     }; 
     onError = function() {}; 
     onClose = function() {}; 
     channel = new goog.appengine.Channel('channel-2840733866-1367208241-185804764220139124118'); 
     socket = channel.open(); 
     socket.onopen = onOpened; 
     socket.onmessage = onMessage; 
     socket.onerror = onError; 
     socket.onclose = onClose; 
    </script> 
    <form method="post" action="/"> 
     <input type="text" name="key" value="185804764220139124118"> 
     <input type="submit" name="submit" value="Receive Messages"> 
    </form> 
    <div id="messageBox"><!-- message should go in here --></div> 
</body> 
</html> 

回答

1

我现场至少有两个错误:

第一

<script type='text/javascript'> 

onMessage = function(message) { 
     var messageBox = document.getElementById("messageBox"); 
     messageBox.innerHTML = message.data; 
    }; 
+1

哇,我应该得到一些睡眠之前,我张贴。感谢dragonx,就是这一切!我在github上发布了其他任何可能无法启动并使用channel-api运行的人:https://github.com/forestcoder/simple-task-queue-channel-api – 2013-04-30 00:57:14

相关问题