Вопрос

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

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

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

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

Другие советы

Вы смотрели на такие вещи, как Ruote и Minion?

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

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

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

Ваше здоровье

алексис

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top