如何让MQTT客户端在Appengine上运行(python)
尝试在付费 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
你试图运行一个独立的脚本作为您的GAE应用worker
服务。它不会工作。
您的worker.py
需要包含名为app
的WSGI应用程序以匹配您的worker.yaml
配置。
从Handlers element表script
行:
一个脚本:指令必须是一个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–299
或404
的HTTP 状态代码,它被认为有成功 启动,并且可以处理其他请求。否则,App Engine 将终止该实例。手动缩放实例立即重新启动 ,而基本缩放实例仅在需要服务流量的 时重新启动。
是的,它最初是作为一个应用程序运行。该脚本仍然运行,因为它不需要任何http处理程序。我已经将它改回到结果没有改变的情况。 – Fakeer
但至少现在你看到你的代码在某种程度上执行了。你只需要在进入循环之前以某种方式回应一个可接受的返回代码。不知道是否有可能在同一个请求上,你可能需要以不同的方式做。 –