我使用简单的应用来验证我遇到的问题。
我的任务add
将一些字符串附加到文本文件中。
当RabbitMQ运行时,我从执行send_task('add', ('my message',))
的ipython shell中实现了这个附加功能。
然后我手动停止RabbitMQ并在同一个ipython会话中执行send_task('add', ('a new message',))
。执行此操作时不会发生任何异常。
'一个新的消息' 从未入队过,也没有注意到这一点。
在随后的send_task调用中,引发OperationalError: [Errno 104] Connection reset by peer
,我使用try/except
正确处理。
我怎样才能避免这个"第一条消息"当兔子离线时丢失了?
提前致谢。
此处有一段视频在行动中显示此问题! https://www.youtube.com/watch?v=WmAYBkVJk7Q
tasks.py
from celery import Celery
app = Celery('tasks', broker='amqp://dev:dev@127.0.0.1/')
@app.task
def add(algo):
print('Writing "{}" to file'.format(algo))
open('/tmp/pepe.txt', 'a').write('{}\n'.format(algo))
ipython shell (刚刚停止使用rabbitmq后)
In [1]: from celery import Celery
In [2]: cel = Celery('tasks', broker='amqp://dev:dev@127.0.0.1/')
In [3]: cel.send_task('tasks.add', ('my message 23',))
Out[3]: <AsyncResult: a2167d23-3190-480b-bdb0-96dd1c98b08c>