2017-04-03 65 views
0

尝试在付费 GAE应用程序上运行简单的MQTT客户端(不是代理)。然而一个on_connect回调从来没有发生在以下:如何让MQTT客户端在Appengine上运行(python)

worker.py

import webapp2 
import paho.mqtt.client as paho 

class WorkerHandler(webapp2.RequestHandler): 

    def on_subscribe(client, userdata, mid, granted_qos): 
     print("Subscribed: "+str(mid)+" "+str(granted_qos)) 

    def on_message(client, userdata, msg): 
     print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload)) 

    def on_connect(client, userdata, flags, rc): 
     client.subscribe("$SYS/#") 
     print "Subscribed to wildcard" 

    def get(self): 
     client = paho.Client() 
     client.on_connect = self.on_connect 
     client.on_subscribe = self.on_subscribe 
     client.on_message = self.on_message 
     client.connect("iot.eclipse.org") 
     print "connected to broker" 
     client.loop_forever() 

app = webapp2.WSGIApplication([ 
    (r'/_ah/start', WorkerHandler), 
]) 

在开发环境它只是一个消息,一分钟后,静静地失败或使

INFO  2017-04-04 01:51:40,958 module.py:813] worker: "GET /_ah/start HTTP/1.1" 500 220 
INFO  2017-04-04 01:51:41,869 module.py:1759] New instance for module "worker" serving on: http://localhost:8080 

connected to broker 
WARNING 2017-04-04 01:52:10,860 module.py:1927] All instances may not have restarted 

此配置作为“后端”/服务和yaml看起来像这样:

worker.yaml

注意:在开发环境,socket.py是直接从蟒蛇进口安装.../2.7/lib中/ python2.7/socket.py

回答

0

你试图运行一个独立的脚本作为您的GAE应用worker服务。它不会工作。

您的worker.py需要包含名为app的WSGI应用程序以匹配您的worker.yaml配置。

Handlers elementscript行:

一个脚本:指令必须是一个Python导入路径,例如, package.module.app指向一个WSGI应用。一个脚本的最后一个组件:使用Python模块路径指令是 模块中的全局变量的名称:变量必须是 WSGI应用程序,通常被称为应用按照约定。

您最有可能发生的错误表示尝试启动工作人员的模块WSGI应用程序失败。

在您更新以恢复WSGI应用程序之后,错误消息的原因变得更加清晰:WorkerHandler.get()方法不响应/_ah/start请求,因为它卡在client.loop_forever()中。

Startup:响应于启动请求,该请求 是一个空的HTTP GET请求/_ah/start创建

每个服务实例。 App Engine发送这个 请求以使实例生效;用户不能发送 请求到/_ah/start。手动和基本缩放实例必须在启动请求 之前处理其他请求。

...

当一个实例响应/_ah/start要求与200–299404的HTTP 状态代码,它被认为有成功 启动,并且可以处理其他请求。否则,App Engine 将终止该实例。手动缩放实例立即重新启动 ,而基本缩放实例仅在需要服务流量的 时重新启动。

+0

是的,它最初是作为一个应用程序运行。该脚本仍然运行,因为它不需要任何http处理程序。我已经将它改回到结果没有改变的情况。 – Fakeer

+0

但至少现在你看到你的代码在某种程度上执行了。你只需要在进入循环之前以某种方式回应一个可接受的返回代码。不知道是否有可能在同一个请求上,你可能需要以不同的方式做。 –