×
Твой новый блог на Ruby on Rails (25 дек 2020)

Не жумлой единой, как говорится. Подключайтесь. :)

Вопрос How to do scheduling using Sidekiq Cron on Ruby on Rails

Больше
3 мес. 2 нед. назад - 3 мес. 2 нед. назад #1 от Aleksej



Кратенькое для новичков ЦУ относительно "how to start" в Ruby on Rails работу с sidekiq - планировщиком (хотя, вернее сказать, всего только "выполнителем") заданий с открытым исходным кодом, и sidekiq-cron (a scheduling add-on for Sidekiq). Active Job, фреймворк для объявления заданий и их запуска на разных бэкендах для очередей - по-умолчанию имеет, в том числе, и встроенный адаптер для бэкенда очередей Sidekiq.

Сложно прибавить что-либо существенное к документации Active Job, к которой и следует обратиться в первую очередь, "чтобы начать": она более чем несложна. Приведу навскидку произвольный пример реализации выполнения задачи посредством Active Job (например, будем постить твиты):

def post(array_posts, tweet)
    array_posts.each do |i|
      PostingTweetsJob.perform_later(i, tweet)
    end
end
# app/jobs/posting_tweets_job.rb
class PostingTweetsJob < ApplicationJob
  queue_as :default

  def perform(i, tweet)
    config = {
      consumer_key: tweet&.key,
      consumer_secret: tweet&.secret,
      access_token: tweet&.token,
      access_token_secret: tweet&.token_secret
    }
    client = Twitter::REST::Client.new config

    client.update(i)
    puts 'Posted:' + Time.now.to_s + ' : ' + i
  end
end

И сразу далее. Добавляем в Gemfile и бундлим:

gem 'sidekiq', '~>6.0.0'
gem "sidekiq-cron", "~> 1.1"

Нам понадобится установленный и запущенный Redis:

$ sudo service redis restart

ОК, далее:

# config/schedule.yml
my_first_job:
  cron: "*/1 * * * *" #it will retrieve data every 1 minute
  class: "HardWorker"
# config/initializers/sidekiq.rb
schedule_file = "config/schedule.yml"
if File.exist?(schedule_file) && Sidekiq.server?
  Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file)
end
# app/jobs/hard_worker.rb
class HardWorker
  include Sidekiq::Worker

  def perform()
    p 'Hello World!'
  end
end

Указываем Ruby on Rails адаптер бэкенда очередей (хотя для демонстрации данного примера рельсы нам, в общем-то, и не нужны):

# config/application.rb
 config.active_job.queue_adapter = :sidekiq
 
и вот теперь:
$ bundle exec sidekiq

...и sidekiq уже работает, выполняя предписанную задачу раз в минуту:

2021-01-28T22:51:03.245Z pid=10080 tid=4to class=HardWorker jid=0de0ca20ba891d00ab13b544 INFO: start
"Hello World!"
2021-01-28T22:51:03.250Z pid=10080 tid=4to class=HardWorker jid=0de0ca20ba891d00ab13b544 elapsed=0.005 INFO: done
Последнее редактирование: 3 мес. 2 нед. назад пользователем Aleksej.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
3 мес. 1 нед. назад #2 от Aleksej

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
2 мес. 3 нед. назад #3 от Nguen
Внятных материалов по sidekiq на русском мало...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
2 мес. 3 нед. назад - 2 мес. 3 нед. назад #4 от serge

Внятных материалов по sidekiq на русском мало...


Добавление Sidekiq и Redis в приложение Ruby on Rails, отличная статья на русском: www.digitalocean.com/community/tutorials...rails-application-ru

А я смогу! - А поглядим! - А я упрямый!
Последнее редактирование: 2 мес. 3 нед. назад пользователем serge.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.