mirror of
https://github.com/zulip/zulip.git
synced 2025-11-15 11:22:04 +00:00
Tornado reloads the app whenever there is a change in code. Due to this, new connection is created to the client which also results in a new channel. To avoid creating two channels for the queue in the RabbitMQ broker we should close the old channel. Otherwise messages sent to the queue will be distributed among these two channels in a round robin scheme and we will end up losing one message since one of the channels doesn't have an active consumer. This commit closes the connection to the queue whenever Tornado reloads the application using add_reload_hook(). Fixes #5824.
37 lines
1.4 KiB
Python
37 lines
1.4 KiB
Python
from __future__ import absolute_import
|
|
from __future__ import print_function
|
|
|
|
import atexit
|
|
|
|
from django.conf import settings
|
|
|
|
from zerver.tornado.handlers import AsyncDjangoHandler
|
|
from zerver.tornado.socket import get_sockjs_router
|
|
from zerver.lib.queue import get_queue_client
|
|
|
|
import tornado.autoreload
|
|
import tornado.web
|
|
|
|
def setup_tornado_rabbitmq():
|
|
# type: () -> None
|
|
# When tornado is shut down, disconnect cleanly from rabbitmq
|
|
if settings.USING_RABBITMQ:
|
|
queue_client = get_queue_client()
|
|
atexit.register(lambda: queue_client.close())
|
|
tornado.autoreload.add_reload_hook(lambda: queue_client.close()) # type: ignore # TODO: Fix missing tornado.autoreload stub
|
|
|
|
def create_tornado_application():
|
|
# type: () -> tornado.web.Application
|
|
urls = (r"/notify_tornado",
|
|
r"/json/events",
|
|
r"/api/v1/events",
|
|
)
|
|
|
|
# Application is an instance of Django's standard wsgi handler.
|
|
return tornado.web.Application(([(url, AsyncDjangoHandler) for url in urls] +
|
|
get_sockjs_router().urls),
|
|
debug=settings.DEBUG,
|
|
autoreload=settings.AUTORELOAD,
|
|
# Disable Tornado's own request logging, since we have our own
|
|
log_function=lambda x: None)
|