我正在使用一个允许用户在日历上创建事件(一次性或重复性)的Web应用程序,并且在事件启动前不久,系统将通知其参与者.我在为这种通知设计流程时遇到了麻烦,特别是对于重复发生的事件.
定期事件可能已排除日期(类似于RRULE和EXDATE组合).
用户可以更新事件的时间/重复规则.
该应用程序是用Python编写的,并且已经使用带有Redis代理的Celery 3.1.解决方案使用此设置会很好,但任何事情都可以.根据我的发现,目前很难用Celery动态添加周期性任务.
定期任务每天运行一次,扫描每个数据库并添加任务以在适当的时间为每天发生重复的事件发出通知.
如上生成的每个任务都将其ID临时保存在Redis中.如果用户在安排通知任务后更改当天的事件时间,则该任务将被撤销并替换为新任务.
上述解决方案的示例代码:
在tasks.py,所有要运行的任务:
from celery.task import task as celery_task
from celery.result import AsyncResult
from datetime import datetime
# ...
@celery_task
def create_notify_task():
for account in system.query(Account):
db_session = account.get_session() # get sql alchemy session
for event in db_session.query(Event):
schedule_notify_event(account, partial_event)
@celery_task(name='notify_event_users')
def notify_event_users(account_id, event_id):
# do notification for every event participant
pass
def schedule_notify_event(account, event):
partial_event = event.get_partial_on(datetime.today())
if partial_event:
result = notify_event_users.apply_async(
args = (account.id, event.id),
eta = …Run Code Online (Sandbox Code Playgroud)