From e913aeae3703bbc117288cf005175cbf2cf75b0b Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Sun, 10 Jan 2021 20:23:55 +0100
Subject: [PATCH] =?UTF-8?q?Spou=C5=A1t=C4=9Bn=C3=AD=20job=C5=AF=20pomoc?=
 =?UTF-8?q?=C3=AD=20uwsgi=20mules?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 TODO                  |  5 +++--
 etc/uwsgi.ini.example |  1 +
 mo/web/__init__.py    | 34 ++++++++++++++++++++++++++++++++++
 setup.py              |  1 +
 4 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/TODO b/TODO
index 4d59484e..98a58e30 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,5 @@
-- select for update
-
 Nasazení:
 - zkontrolovat rotování logů (i u /akce/mathletics/ a jiných instancí uwsgi)
+- zapnout mule v uwsgi.ini
+- upgradovat strukturu DB
+- doplnit config.py
diff --git a/etc/uwsgi.ini.example b/etc/uwsgi.ini.example
index c8e1c202..c2559d9d 100644
--- a/etc/uwsgi.ini.example
+++ b/etc/uwsgi.ini.example
@@ -18,5 +18,6 @@ mount = /osmo-test=mo.web:app
 plugin = python3
 virtualenv = venv
 manage-script-name = true
+mule
 
 static-map = /static=static
diff --git a/mo/web/__init__.py b/mo/web/__init__.py
index 31b84a90..5e52757d 100644
--- a/mo/web/__init__.py
+++ b/mo/web/__init__.py
@@ -13,6 +13,7 @@ import werkzeug.exceptions
 import mo
 import mo.config as config
 import mo.db as db
+import mo.jobs
 import mo.users
 import mo.util
 from mo.util import logger
@@ -83,6 +84,39 @@ def init_request():
 app.before_request(init_request)
 
 
+### UWSGI glue ###
+
+try:
+    import uwsgi
+    from uwsgidecorators import timer, signal
+
+    # Čas od času se probudíme a projdeme joby pro případ, že by se ztratil signál.
+    # Také při tom expirujeme zastaralé joby.
+    @timer(120, target='mule')
+    def mule_timer(signum):
+        app.logger.debug('Mule: Timer tick')
+        with app.app_context():
+            mo.now = mo.util.get_now()
+            mo.jobs.process_jobs()
+
+    # Obykle při vložení jobu dostaneme signál.
+    @signal(42, target='mule')
+    def mule_signal(signum):
+        app.logger.debug('Mule: Přijat signál')
+        with app.app_context():
+            mo.now = mo.util.get_now()
+            mo.jobs.process_jobs()
+
+    def wake_up_mule():
+        app.logger.debug('Mule: Posíláme signál')
+        uwsgi.signal(42)
+
+    mo.jobs.send_notify = wake_up_mule
+
+except ImportError:
+    app.logger.warn('Nenalezeno UWSGI, takže automatické notifikace nepoběží.')
+
+
 # Většina webu je v samostatných modulech
 import mo.web.auth
 import mo.web.menu
diff --git a/setup.py b/setup.py
index a7c8f036..e4d89a8b 100644
--- a/setup.py
+++ b/setup.py
@@ -30,5 +30,6 @@ setuptools.setup(
         'pikepdf',
         'psycopg2',
         'sqlalchemy',
+        'uwsgidecorators',
     ],
 )
-- 
GitLab