требовать работу в Sweatshop в RabbitMQ - PullRequest
5 голосов
/ 05 января 2010

Я работаю над приложением Rails, в котором возмещение клиенту передается работнику Sweatshop. Если возврат не удастся (потому что мы не можем связаться с обработчиком платежей в это время), я хочу вернуть работу.

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 я не нашел никакой функции «задержки», и это лучшее решение, которое я до сих пор предлагал. Я хочу избежать занятой петли во время повторного заказа.

Ответы [ 3 ]

3 голосов
/ 05 января 2010

Вы смотрели на такие вещи, как Руотэ и Миньон?

Некоторые ссылки здесь: http://delicious.com/alexisrichardson/rabbitmq+work+ruby

Вы также можете попробовать Celery, который не говорит на нативном Ruby, но говорит на HTTP + JSON.

Все вышеперечисленное работает с RabbitMQ, поэтому может помочь вам.

Приветствия

1012 * Alexis *

1 голос
/ 05 января 2010

Есть служба доставки по времени? Вы отправили бы сообщение для доставки как полезную нагрузку, завернутую с временем доставки, и служба удерживала сообщение, пока не было достигнуто указанное время. Насколько мне известно, на сервере RabbitMQ или в любой из клиентских библиотек AMQP ничего подобного не существует, но это было бы полезно иметь.

0 голосов
/ 10 января 2010

Не похоже, что AMQP (или, по крайней мере, RabbitMQ) поддерживает идею «отложить эту работу». Таким образом, подход для постановки той же работы в очередь изнутри рабочего в случае неудачи представляется наилучшим решением в настоящее время.

У меня есть код, работающий в демонстрационной среде, и он соответствует моим потребностям.

...