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

相關問題