2013-08-28 4 views
3

Я написал несколько действий в приложении RoR, которые выполняют разные действия в процессе.Возможно ли выполнение строковых/очередей Ruby-действий?

E.g. - Одно действие связывается со сторонней службой, используя их API и собирает данные. - Другой обрабатывает эти данные и помещает их в соответствующую базу данных. - Другой принимает эти новые данные и форматирует их определенным образом. и т. Д.

Я хотел бы отключить процесс с временными интервалами, например. Каждый час. Но я не хочу делать все это каждый раз.

Иногда я могу просто сделать первые два действия. В других случаях я мог бы выполнять каждую часть процесса.

Итак, выполните одно действие, а затем, когда оно будет завершено, вызовите другое действие. ETC ..

Действия могут занять до часа, если не дольше, поэтому мне нужно решение, которое не будет таймаутом.

Что было бы лучшим способом достичь этого?

+0

связанной с [вопрос] (http://stackoverflow.com/questions/388016/spinning-background-tasks-in-rails#388043) –

+0

Это пост с 2008 года, так что протектор слегка – tyler

+0

Вы посмотрели на использование cronjobs? – Davidann

ответ

3

У вас есть довольно много вариантов для обработки заданий в фоновом режиме:

Просто прочитайте и выберите тот, который кажется чтобы соответствовать вашим критериям наилучшим образом.

EDIT Как вы уточнили, вы хотите регулярно планировать задачи. Заводной является большим драгоценным камнем для этого (и в целом лучше, чем варианта хрон):

+0

Спасибо, Sidekiq выглядит очень удобно. Я должен был быть явным в своем описании относительно того, что они будут происходить с повторяющимися интервалами. Пользователь никогда не будет запущен. По линии каждого часа он будет работать (действие 1 -> действие 2). И затем каждые 12 часов он будет работать (действие 3).После быстрого поиска я думаю, что что-то вроде Clockwork было бы хорошо подходит для этого, если только другой камень не подходит для этой задачи? (https://github.com/tomykaira/clockwork) –

+0

Получил это. Да Clockwork был бы хорош для этого - он сохраняет фоновый процесс, так что вы не тратите тонны ресурсов, спулинг новой среды каждый раз, когда вы хотите выполнять работу (как это происходит с заданиями cron) – tyler

+0

Последнее. Я инициирую вызовы метода, используя rake, который работает нормально локально. На сервере, однако, просто кажется, что тайм-аут. Будет ли это использование эффектов background_tasks? –

1

Если вы ищете хорошее решение ванили, что-то вроде этого должно вам начать

Generic класс с методами

class Api 
    def a 
    puts "a" 
    end 

    def b 
    puts "b" 
    end 

    def c *args 
    puts args.inspect 
    end 
end 

class Queue 

    def initialize delay 
    @queue = [] 
    @delay = delay 
    end 

    def add &block 
    @queue << block 
    end 

    def run 
    block = @queue.shift 
    block.call() if block 
    sleep @delay 
    run 
    end 
end 

Пример использования

api = Api.new 
q = Queue.new 5 

q.add { api.a } 
q.add { api.b } 
q.add { api.c 1, 2, 3 } 
q.run 

Выход

a 
b 
[1, 2, 3] 
Смежные вопросы