Зарегистрируйтесь, чтобы продолжить обучение

Jobs Ruby: Полный Rails

Программа урока

  • Создание Active Job
  • Бэкенд и коллбеки Active Job
  • Отправка писем, обработка ошибок с Active Job
# bin/rails g job fetch_books_titles
#       create  test/jobs/fetch_books_titles_job_test.rb
#       create  app/jobs/fetch_books_titles_job.rb

# app/jobs/fetch_books_titles_job.rb
class FetchBooksTitlesJob < ApplicationJob
  queue_as :default

  def perform(*args)
    # Do something later
  end
end

# test/jobs/fetch_books_titles_job_test.rb
require "test_helper"

class FetchBooksTitlesJobTest < ActiveJob::TestCase
  # test "the truth" do
  #   assert true
  # end
end


# app/jobs/fetch_books_titles_job.rb
class FetchBooksTitlesJob < ApplicationJob
  queue_as :default

  def perform
    titles = Book.pluck(:title)
    pp titles
  end
end

# bin/rails g job fetch_books_titles --queue urgent
# app/jobs/fetch_books_titles_job.rb
class FetchBooksTitlesJob < ApplicationJob
  # --queue задает очередь в которую попадает задача
  queue_as :urgent

  def perform(*args)
    # Do something later
  end
end

# Вызов джобы
FetchBooksTitlesJob.perform_later # Джоба выполняется после выполнения основного процесса
FetchBooksTitlesJob.perform_now # Джоба запускается непосредственно

# Выполнить через 5 секунд
FetchBooksTitlesJob.set(wait: 5.seconds).perform_later
# Запустить через 10 секунд, в определенное время
FetchBooksTitlesJob.set(wait_until: Time.now + 10.seconds).perform_later

# config/application.rb
require_relative "boot"

require "rails/all"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module Books
  class Application < Rails::Application
    config.load_defaults 6.1

    # https://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html
    config.active_job.queue_adapter = :sidekiq
    config.active_job_queue_name_prefix = Rails.new
    config.active_job_queue_name_delimiter = '.'
  end
end

# Запуск задачи в заданной очереди
FetchBooksTitlesJob.set(queue: :low_priority).perform_later

# app/jobs/fetch_books_titles_job.rb
class FetchBooksTitlesJob < ApplicationJob
  # Очередь задается динамически
  # queue_as { cond ? :default : :high_priority }

  def perform
    titles = Book.pluck(:title)
    pp titles
  end
end

# Доступные коллбеки
# https://edgeguides.rubyonrails.org/active_job_basics.html#available-callbacks
before_enqueue
around_enqueue
after_enqueue
before_perform
around_perform
after_perform

# app/jobs/fetch_books_titles_job.rb
class FetchBooksTitlesJob < ApplicationJob
  around_perform :improve_output

  def perform
    titles = Book.pluck(:title)
    pp titles
  end

  def improve_output
    pp '*******************************************'
    yield
    pp '*******************************************'
  end
end

# https://guides.rubyonrails.org/action_mailer_basics.html
# bin/rails g mailer new_book
#       create  app/mailers/new_book_mailer.rb
#       create    app/views/new_book_mailer
#       create    test/mailers/new_book_mailer_test.rb
#       create    test/mailers/previews/new_book_mailer_preview.rb

# app/mailers/new_book_mailer.rb
class NewBookMailer < ApplicationMailer
  default from: 'book@example.com'

  def new_book
    mail(
      to: 'user@examplle.com',
      subject: 'New book'
    )
  end
end

# app/views/new_book_mailer/new_book.txt.erb
New book has been created

# Отправка письма
NewBookMailer.new_book.deliver_later
NewBookMailer.new_book.deliver_now



# https://github.com/mperham/sidekiq
# Для работы sidekiq требуется запущенный redis
# Для выполнения задач требуется запущенный sidekiq
# bundle exec sidekiq

# Gemfile
gem 'sidekiq'

# config/application.rb
require_relative "boot"

require "rails/all"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module Books
  class Application < Rails::Application
    config.load_defaults 6.1

    # https://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html
    config.active_job.queue_adapter = :sidekiq
  end
end

# config/sidekiq.yml
# В этомф файле хранятся настройки sidekiq
# :concurrency: 2
# :logfile: ./log/sidekiq.log
# :queues:
#   - default
#   - mailers

# Open http://localhost:3000/sidekiq

# app/jobs/fetch_books_titles_job.rb
class FetchBooksTitlesJob
  #
  include Sidekiq::Worker

  def perform
    titles = Book.pluck(:title)
    pp titles
  end

  def improve_output
    pp '*******************************************'
    yield
    pp '*******************************************'
  end
end

# Для асинхронных джоб с sidekiq изменяется способ их вызова
FetchBooksTitlesJob.perform_async
FetchBooksTitlesJob.perform_in(5.seconds)

# ActiveJob perform_now / perform_later
# Sidekiq perform_async / perform_in

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 28 908 ₸ в месяц
Создание веб-приложений со скоростью света
5 месяцев
c опытом
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу