2016-06-24 1 views
0

Я хочу сделать что-то вроде следующего: когда пользователь нажимает на кнопку, я отправляю запрос ajax на сервер, а сервер начинает делает фоновый ввод-вывод пока пользователь сразу получает ответ, говорит «он запущен». Это все для пользователя.Краткосрочные фоновые задания в Ruby или Rails с таймером

На сервере происходит фоновая операция. Операция должна выполняться, скажем, 10 раз за 10 минут. Это что-то вроде периодический опрос статуса чего-то, скажем, базы данных. В состоянии изменилось менее чем за 10 минут, операция должна немедленно остановить, так что это может быть 1 минута или 3 минуты. В противном случае операция продолжается. И самое большее - 10 раз в течение 10 минут.

I , конечно, не хотите использовать любые сторонние библиотеки, потому что я знаю, что могу сделать это с помощью чистого рубина или Rails. Не имеет значения, что это сложнее.

Как я могу это сделать?

Я знаю, я должен создать тему, но как именно я должен сделать эту часть "постоянно опрашивать статус чего-то в течение 10 минут максимум один раз в минуту, не более 10 раз, и если некоторое условие правда, тогда все готово, сразу закончите. "

Обратите внимание, что это упрощенная версия того, что я хочу, но идея в том, что я описал.

+0

Вы можете использовать 'ActiveJob'. Посмотрите http://stackoverflow.com/questions/25798013/how-do-i-schedule-recurring-jobs-in-active-job-rails-4-2 –

ответ

1

Следующий код кажется, что вы после:

sleep_time = 60 # seconds 
attempt = 0 
max_attempts = 10 
while (attempt < max_attempts) 
    condition_met = check_condition() 
    break if(condition_met) 
    attempt += 1 
    sleep(sleep_time) 
end 

В зависимости от вашего сервера, порождая поток может быть важным. Например, если сервер работает только в одном потоке, и вы запускаете вышеуказанный код, ваш сервер остановится во время сна. То есть сервер не будет отвечать на любые последующие запросы. Если вы создаете поток, только поток будет спать, но основной процесс сервера будет продолжен. Я не могу сказать больше, если вы не предоставите подробные сведения о своем сервере. Это WEBrick? тонкий?

Что касается комментариев пользователя, нажавшего кнопку, чтобы вызвать это действие, это может быть так же просто, как запрос HTTP POST для какого-либо контроллера Ruby on Rails, который вы внедрили. Он может сообщить пользователю, что операция продолжается, если запрос завершается успешно.