фоновое приложение ruby ​​on rails для автоматического запуска заданий во время, определяемое пользователями? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть случай, когда пользователь планирует «команду» из веб-интерфейса.Пользователь также указывает дату и время запуска команды.

Это последовательность шагов:

1. Пользователь планирует команду «Перезапустить устройство» на 31 мая, 15:00.1005 *

2.Это сохраняется в таблице базы данных с именем Command.

3.Теперь должна быть фоновая работа, которая должна быть запущена в указанное время, чтобы что-то сделать (сделать вызов API, отправьте электронное письмо и т. д.)

4. Как только задание выполнено, оно удаляется или помечается как выполненное, пока не будет введена новая команда.

Возможно, несколько пользователей одновременно выполняют вышеуказанную последовательность действий:шаги.

Является ли delayed_job хорошим выбором для выше?Я не смог найти пример того, как реализовать вышеизложенное с использованием отложенного задания.

РЕДАКТИРОВАТЬ: причина, по которой я смотрел на delayed_job, заключается в том, что в конечном итоге мне нужно будет использовать существующую реляционную базу данных

Ответы [ 2 ]

3 голосов
/ 30 апреля 2019

Я бы посоветовал использовать Sidekiq .С его помощью вы можете использовать запланированные задания , чтобы указать sidekiq, когда выполнять задания.

Пример: MyWorker.perform_at(3.hours.from_now, 'mike', 1)

РЕДАКТИРОВАТЬ : пример работника

#app/workers/restart_device_worker.rb
class RestartDeviceWorker
  include Sidekiq::Worker

  def perform(params)
    # Do the job
    # ...
    # update in DB
  end
end

1 голос
/ 30 апреля 2019

см. Документ: https://blog.codeship.com/how-to-use-rails-active-job/ https://guides.rubyonrails.org/active_job_basics.html

Если вы используете Rails 5, тогда у вас есть лучший вариант ActiveJob (встроенная функция)

Использовать ActiveJob

"Активное задание - сделайте работу более поздней. Активное задание - это структура для объявления заданий и их запуска в различных серверных очередях. Эти задания могут быть любыми: от регулярных плановых очисток до выставления счетовпересылка на почтовые рассылки. Все, что можно нарезать на небольшие единицы работы и выполнять параллельно, действительно. "

Active Job имеет встроенные адаптеры для нескольких серверных очередей (Sidekiq, Resque, Delayed Job и другие).).Вам просто нужно сказать им.

Сценарий: Я хочу удалить свою историю через 24 часа (1 день).Затем мы создаем работу с именем "StoriesCleanupJob".Назовите эту работу во время создания истории, как показано ниже:

StoriesCleanupJob.set(wait: 1.day).perform_later(story)

Она вызовет работу через 1 день.

class StoriesCleanupJob < ApplicationJob
  queue_as :default

  def perform(story)
      if story.destroy
            #put your own conditions like update the status and all, whatever you want to perform.
      end
  end
end
...