2017-04-03 50 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

但至少現在你看到你的代碼在某種程度上執行了。你只需要在進入循環之前以某種方式迴應一個可接受的返回代碼。不知道是否有可能在同一個請求上,你可能需要以不同的方式做。 –

相關問題