1

Я пытаюсь определить очередь задач и API канала.Использовать API канала для приема сообщений из задачи в очереди задач

У меня есть процесс, который должен работать> 60 секунд, добавленных в очередь задач, когда пользователь отправляет форму. Затем этот процесс должен отправлять сообщения через канал api по мере его выполнения. Грубый, я не могу сделать эту работу. Может ли кто-нибудь сказать мне, почему SendMessagesHandler не может отправлять сообщения на стороне клиента javascript? Или, возможно, javascript на стороне клиента не получает должным образом? Кроме того, я не вижу сообщений logging от SendMessagesHandler в Log Console, он показывает только прогон мельницы INFO ... GET или POST. Когда я пишу это, я понимаю, что у меня должно быть более одной проблемы, поэтому задача создается в очереди задач, я вижу ее на консоли SDK, однако она, похоже, работает бесконечно, я бы ожидал он должен работать примерно 1 м2сек. Если я вытащил команды sleep из SendMessageHandler, он бежит, чтобы быстро поймать его в консоли 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

I выявить как минимум две ошибки:

Первый

<script type='text/javascript'> 

Второй

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

Ничего себе, я должен был получить некоторый сон, прежде чем я отправил это. Спасибо dragonx, это было все, что нужно! Я разместил это на github для всех, у кого может возникнуть трудности с запуском и запуском с каналом-api: https://github.com/forestcoder/simple-task-queue-channel-api –