我正在Rails应用程序中将客户退款交给血汗工厂工人。如果退款失败(因为我们当时无法到达付款处理器),我想重新安排工作。要求在RabbitMQ的血汗工厂工作
class RefundWorker < Sweatshop::Worker
def process_refund(job)
if refund
Transaction.find(job[:transaction]).update_attributes(:status => 'completed')
else
sleep 3
RefundWorker.async_process_refund(job) # requeue the job
end
end
有没有比这更好的方法呢?我还没有在RabbitMQ中发现任何“延迟”功能,这是迄今为止我提出的最好的解决方案。我希望在重新排队时避免繁忙的循环。
芹菜这样做的任务与eta /倒计时。它只是保留消息,并且有一个调度程序在满足eta时执行任务。由于这些消息需要被确认,因此在使用QoS预取计数时有点古怪,因为每次收到一个带有eta的消息时都必须增加预取计数,并在eta消息已被处理。 – asksol 2010-02-01 16:30:50