私は、RabbitMQバックエンドを持つセロリの作業者にタスクを送信して長時間実行する(〜分)計算に使用するTornadoサーバーを持っています。投稿されたタスクは、WebSocketHandler
内トルネードコルーチンで得られたされていますTornadoウェブソケットと長時間実行されるセロリのタスク
class MainWSHandler(WebSocketHandler):
def open(self):
logging.info("Connection opened.")
def on_close(self):
logging.info("Connection closed.")
def on_message(self, message):
result = self.submit_task(message)
self.write_message("Calculation has been submitted")
@gen.coroutine
def submit_task(self, params):
result = yield gen.Task(long_calculation.apply_async, args=[params])
self.write_message("Completed calculation")
return result
ユーザーが現在開かれているウェブソケットにページを離れることがない場合、これはうまく動作します。それらが実行され、Webソケットが閉じると、返されたメッセージself.write_message("Completed calculation")
は、WebSocketClosedError
で失敗します。ユーザーがしばらくページに戻ってこない場合(つまり、計算が完了するまで)、これは問題ありません。
ただし、ユーザーが計算を実行して、そのページを離れてから計算が終了する前に戻ると、Webソケットが閉じられ、新しいものが開かれているため同じエラーが発生します。これにより、計算完了メッセージがフロントエンドに伝播されなくなります。
私の質問は、同じWebソケットに再接続できますか?あるいは、計算が完了した後に返されたメッセージをユーザーの現在のページに確実に戻す方法を教えてください。