尝试在付费 GAE应用上运行简单的MQTT客户端(而不是代理)。但是,以下内容永远不会发生on_connect
回调:
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
service: worker
runtime: python27
api_version: 1
threadsafe: true
instance_class: B8
manual_scaling:
instances: 1
handlers:
# If a service has an _ah/start handler, it should be listed first.
- url: /_ah/start
script: worker.app
注意:在开发环境中,socket.py直接从python install导入... / 2.7 / lib / python2.7 / socket.py
答案 0 :(得分:0)
您正在尝试将独立脚本作为GAE应用worker
服务运行。它不会起作用。
您的worker.py
需要包含一个名为app
的WSGI应用程序,以匹配您的worker.yaml
配置。
从Handlers element表中的script
行:
脚本:指令必须是python导入路径,例如, package.module.app 指向WSGI应用程序。使用 Python模块路径的脚本:指令的最后一个组件是 模块中全局变量的名称:该变量必须是a WSGI应用程序,通常按惯例称为 app 。
您最有可能发生的错误表明尝试启动工作者模块WSGI应用程序失败。
在您更新以恢复WSGI应用程序之后,错误消息的原因变得更加清晰:WorkerHandler.get()
方法不响应/_ah/start
请求,因为它卡在{{1}中}。
来自Startup:
创建每个服务实例以响应启动请求 是
client.loop_forever()
的空HTTP GET请求。 App Engine发送此信息 要求提出实例;用户无法发送 请求/_ah/start
。手动和基本扩展实例必须 在他们可以处理另一个请求之前响应开始请求。...
当实例使用HTTP响应
/_ah/start
请求时 状态代码为/_ah/start
或200–299
,认为已成功完成 已启动,可以处理其他请求。否则,App Engine 终止实例。手动缩放实例重新启动 立即,而基本缩放实例仅在重新启动时重新启动 提供交通所需。