Если вы просматриваете это по адресу https://github.com/collectiveidea/delayed_job, вы читаете документацию для главной ветви. Просмотреть документацию для последнего выпуска (4.1.13).
Задержка :: JOW (или DJ) инкапсулирует общую модель асинхронного выполнения более длинных задач на заднем плане.
Это прямое извлечение из Shopify, где таблица работы отвечает за множество основных задач. Среди этих задач:
Отправляя массовые информационные бюллетени
Изменение размера изображения
HTTP загрузки
Обновление интеллектуальных коллекций
Обновление SOLR, наш сервер поиска, после изменения продукта
партийный импорт
SPAM -проверки
Следуйте за нами в Twitter, чтобы получить обновления и уведомления о новых выпусках.
Задержка_JOB 3.0.0 только поддерживает Rails 3.0+.
Doyed_job поддерживает несколько бэкэндов для хранения очереди работы. Смотрите вики для других бэкэндов.
Если вы планируете использовать задержку с активной записью, добавьте delayed_job_active_record
в свой Gemfile
.
Gem 'Doyeded_job_active_record'
Если вы планируете использовать задержку с монгоидом, добавьте в свой delayed_job_mongoid
в свой Gemfile
.
gem 'doyed_job_mongoid'
Запустите bundle install
, чтобы установить бэкэнд и драгоценные камни Doyed_job.
Активная бэкэнд записи требует таблицы заданий. Вы можете создать эту таблицу, выполнив следующую команду:
rails generate delayed_job:active_record rake db:migrate
Для Rails 4.2+ см. Ниже
В режиме разработки, если вы используете Rails 3.1+, ваш код приложения будет автоматически перезагрузить каждые 100 заданий или после завершения очереди. Вам больше не нужно перезагружать заложенную работу каждый раз, когда вы обновляете свой код в разработке.
В Rails 4.2+ установите queue_adapter в config/application.rb
config.active_job.queue_adapter =: doyed_job
Смотрите руководство Rails для получения более подробной информации.
Если вы используете драгоценность Protectect_attributes, он должен появиться перед Doyed_job в вашем Gemfile. Если ваша работа терпела неудачу:
ActiveRecord::StatementInvalid: PG::NotNullViolation: ERROR: null value in column "handler" violates not-null constraint
Тогда это исправление, которое вы ищете.
Задержка задания 3.0.0 вводит новый столбец в таблицу Dowered_jobs.
Если вы обновляетесь с задержки Job 2.x, запустите генератор обновления, чтобы создать миграцию, чтобы добавить столбец.
rails generate delayed_job:upgrade rake db:migrate
Call .delay.method(params)
на любом объекте, и он будет обработан в фоновом режиме.
# без задержки[email protected]! (@Device)# с задержкой[email protected]! (@Device)
Если метод всегда должен работать в фоновом режиме, вы можете позвонить #handle_asynchronously
после объявления метода:
класс устройства def поставьте# долгое время метод конец handle_asynchronals: uellendendevice = device.newdevice.deliver
#handle_asynchronously
и #delay
принимайте эти параметры:
:priority
(номер): более низкие числа запускаются первыми; по умолчанию 0, но может быть перенастроен (см. Ниже)
:run_at
(время): запустить работу после этого времени (вероятно, в будущем)
:queue
(String): названная очередь для помесщения этой работы, альтернатива приоритетам (см. Ниже)
Эти параметры могут быть объектами PROC, что позволяет оценить время вызова значения.
Например:
Класс Лонгтаски def send_mailer# какой -то другой код конец harder_asynchronals: send_mailer,: priority => 20 def in_the_future# Некоторый другой код конец # 5.minutes.from_now будет оцениваться при вызове in_the_future handle_asynchrony: in_the_future,: run_at => proc.new {5.minutes.from_now} def self.when_to_run2.hours.from_now конец Class << selfdef call_a_class_method # Некоторые другие codeendhandle_asynchrony: call_a_class_method ,: run_at => proc.new {ower_to_run} конец ATTR_READER: How_Important def call_an_instance_method# Некоторый другой код конец handle_asynchrony: call_an_instance_method ,: priority => proc.new {| i | i.how_important} end
Если вы когда -нибудь захотите вызвать метод handle_asynchronously
'D без задержки, например, от отладки чего -то в консоли, просто добавьте _without_delay
в имя метода. Например, если ваш оригинальный метод был foo
, то вызовите foo_without_delay
.
Задержка работы использует специальный синтаксис для Rails Mailers. Не вызывайте метод .deliver
при использовании .delay
.
# без задержки_jobnotifier.signup (@user) .deliver# с задержкой_jobnotifier.delay.signup (@user)# doyed_job, работающий на конкретном timenotifier.delay (run_at: 5.minutes.from_now) .signup (@User)# при использовании параметров: , метод. с помощью метода должен быть вызван до .delay Methodnotifier.with (foo: 1, bar: 2) .delay.signup (@user)
Вы также можете рассмотреть вопрос о использовании активной работы с Action Mailer, который предоставляет удобный синтаксис .deliver_later
, который направляется в задержку с работой под капюшоном.
DJ 3 представляет рядные очереди в стиле Resque, сохраняя при этом приоритет в стиле DJ. Цель состоит в том, чтобы предоставить систему для группировки задач, которая будет выполнена отдельными пулами работников, которые могут быть масштабированы и контролируются индивидуально.
Задание можно назначить в очередь, установив опцию queue
:
object.delay (: queue => 'отслеживание'). MethodDelayed :: job.enqueue job ,: queue => 'tracking'handle_asynchrony: tweet_later ,: queue =>' твиты '
Вы можете настроить приоритеты по умолчанию для названных очередей:
Задержка :: Worker.queue_attributes = { High_priority: {Приоритет: -10}, low_priority: {Приоритет: 10}}
Настроенные приоритеты очереди могут быть переопределены, передавая приоритет методу задержки
object.delay (: queue => 'high_priority', приоритет: 0) .method
Вы можете запустить процессы, чтобы работать только в определенных очередях с опциями queue
и queues
, определенных ниже. Процессы, начатые без указания очереди, будут выполнять задания из любой очереди. Чтобы эффективно иметь процесс, который запускает задания, в котором не указана очередь, установите имя очереди по умолчанию с Delayed::Worker.default_queue_name
и запустите процессы.
script/delayed_job
может использоваться для управления фоновым процессом, который начнет работать с задания.
Для этого добавьте gem "daemons"
в свой Gemfile
и убедитесь, что вы запускаете rails generate delayed_job
.
Затем вы можете сделать следующее:
RAILS_ENV=production script/delayed_job start RAILS_ENV=production script/delayed_job stop # Runs two workers in separate processes. RAILS_ENV=production script/delayed_job -n 2 start RAILS_ENV=production script/delayed_job stop # Set the --queue or --queues option to work from a particular queue. RAILS_ENV=production script/delayed_job --queue=tracking start RAILS_ENV=production script/delayed_job --queues=mailers,tasks start # Use the --pool option to specify a worker pool. You can use this option multiple times to start different numbers of workers for different queues. # The following command will start 1 worker for the tracking queue, # 2 workers for the mailers and tasks queues, and 2 workers for any jobs: RAILS_ENV=production script/delayed_job --pool=tracking --pool=mailers,tasks:2 --pool=*:2 start # Runs all available jobs and then exits RAILS_ENV=production script/delayed_job start --exit-on-complete # or to run in the foreground RAILS_ENV=production script/delayed_job run --exit-on-complete
Рельсы 4: замените сценарий/задержка
Рабочие могут работать на любом компьютере, если они имеют доступ к базе данных, а их часы синхронизируются. Имейте в виду, что каждый работник будет проверять базу данных как минимум каждые 5 секунд.
Вы также можете вызвать rake jobs:work
, которая начнет работать с рабочих мест. Вы можете отменить задачу граблей с помощью CTRL-C
.
Если вы хотите просто запустить все доступные задания и выходить, вы можете использовать rake jobs:workoff
Работайте за очереди, установив переменную среды QUEUE
или QUEUES
.
QUEUE=tracking rake jobs:work QUEUES=mailers,tasks rake jobs:work
Следующий синтаксис перезагрузит отложенные задания:
RAILS_ENV=production script/delayed_job restart
Чтобы перезапустить несколько работников задержки с задержкой:
RAILS_ENV=production script/delayed_job -n2 restart
Рельсы 4: замените сценарий/задержка
Задание - это простые предметы Ruby с помощью метода, называемого выполнением. Любой объект, который реагирует на выполнение, может быть забит в таблицу заданий. Рабочие объекты сериализованы на YAML, чтобы позже они могли воскресить бегун.
NewsletterJob = struct.new (: text,: электронные письма) def excumentemails.each {| e | Newslettermailer.deliver_text_to_email (text, e)} EndendDelayed :: job.enqueue Newsletterjob.new ('Lorem ipsum ...', customs.pluck (: email))
Чтобы установить попытки максимального размера, которые переопределяют задержку :: corker.max_attempts Вы можете определить метод max_attempts на задании
NewsletterJob = struct.new (: text,: электронные письма) def excumentemails.each {| e | Newslettermailer.deliver_text_to_email (text, e)} конец def max_attempts3 вернуть
Чтобы установить максимальное время выполнения за предмет, которое переопределяет задержку :: korier.max_run_time Вы можете определить метод MAX_RUN_TIME на задании
Примечание. Это может использоваться только для установки MAX_RUN_TIME, который ниже, чем задержка :: kaber.max_run_time. В противном случае истекает замок на работе, и другой работник начнет работу на работе.
NewsletterJob = struct.new (: text,: электронные письма) def excumentemails.each {| e | Newslettermailer.deliver_text_to_email (text, e)} конец def max_run_time120 # секунд вернуть
Чтобы установить по умолчанию для повторного управления с неудачными заданиями, которые переопределяют задержку :: corker.destroy_failed_jobs Вы можете определить Dissome_failed_jobs? Метод работы
NewsletterJob = struct.new (: text,: электронные письма) def excumentemails.each {| e | Newslettermailer.deliver_text_to_email (text, e)} конец DEF DESSUT_FAILED_JOBS? FALSE вернуть
Чтобы установить имя очереди по умолчанию для пользовательского задания, которое переопределяет Doyeded :: abray.default_queue_name, вы можете определить метод queue_name на задании
NewsletterJob = struct.new (: text,: электронные письма) def excumentemails.each {| e | Newslettermailer.deliver_text_to_email (text, e)} конец def queue_name'newsletter_queue ' вернуть
При ошибке задание снова запланировано через 5 секунд + N ** 4, где n - количество попыток. Вы можете определить свой собственный метод reschedule_at
, чтобы переопределить это поведение по умолчанию.
NewsletterJob = struct.new (: text,: электронные письма) def excumentemails.each {| e | Newslettermailer.deliver_text_to_email (text, e)} конец def reschedule_at (current_time, попытки) current_time + 5. вернуть
Вы можете определить крючки на своей работе, которые будут вызваны на разных этапах процесса:
Примечание. Если вы используете ActiveJob, эти крючки недоступны для ваших заданий. Вам нужно будет использовать обратные вызовы ActiveJob. Вы можете найти подробную информацию здесь https://guides.rubyonrails.org/active_job_basics.html#callbacks
класс ParanoidnewsletterJob <NewsletterJob Dec Enqueue (job) record_stat 'Newsletter_job/enqueue' конец def excumentemails.each {| e | Newslettermailer.deliver_text_to_email (text, e)} конец def перед (job) record_stat 'newsletter_job/start' конец def после (job) record_stat 'Newsletter_job/After' конец def Success (job) record_stat 'Newsletter_job/Успех' конец DEF ERROR (задание, исключение) Airbrake.notify (Исключение) конец def сбой (задание) page_sysadmin_in_the_middle_of_the_night вернуть
Библиотека вращается вокруг таблицы задержки_JOBS, которая выглядит следующим образом:
create_table: doyeded_jobs,: force => true do | таблица | Table.integer: Приоритет,: default => 0 # позволяет некоторым заданиям прыгать на переднюю часть очереди table.integer: попытки: default => 0 # предусматривает повторения, но в конечном итоге не удается. Table.text: Handler # yaml-кодированная строка объекта, который будет работать Table.text: Last_error # Причина последней неудачи (см. Примечание ниже) table.datetime: run_at # Когда запустить. Может быть время. table.datetime: locked_at # установлен, когда клиент работает над этим объектом table.datetime: waill_at # set, когда все повторения не удались (на самом деле, по умолчанию, запись удаляется вместо этого) Table.string: Locked_by #, который работает над этим объектом (если заблокирован) Table.string: очередь # Название очереди. Table.timestampsend
При ошибке задание снова запланировано через 5 секунд + N ** 4, где n - количество попыток или использование определенного метода задания reschedule_at
.
Worker.max_attempts
по умолчанию.max_attempts составляет 25. После этого задание либо удалено (по умолчанию), либо оставлено в базе данных с установленным «faill_at». С дефолтом 25 попыток последняя попытка пройдет через 20 дней, а последний интервал составит почти 100 часов.
Worker.max_run_time
по умолчанию.max_run_time IS 4.hours. Если ваша работа занимает больше времени, другой компьютер может его поднять. Вы должны убедиться, что ваша работа не превышает на этот раз. Вы должны установить это до самого долгого времени, которое, как вы думаете, может заняться.
По умолчанию это удалит неудавшиеся рабочие места (и всегда удаляет успешную работу). Если вы хотите сохранить неудачные задания, установите Delayed::Worker.destroy_failed_jobs = false
. Неудачные задания будут отмечены не null Fail_at.
По умолчанию все задания запланированы с priority = 0
, что является главным приоритетом. Вы можете изменить это, установив Delayed::Worker.default_priority
на что -то другое. Более низкие числа имеют более высокий приоритет.
Поведение по умолчанию состоит в том, чтобы прочитать 5 заданий из очереди при поиске доступной работы. Вы можете настроить это, установив Delayed::Worker.read_ahead
.
По умолчанию все работы будут в очереди без названной очередей. По умолчанию с именованной очередей можно указать с помощью Delayed::Worker.default_queue_name
.
Если рабочие места не найдено, работник спит в течение количества времени, указанного опцией задержки сна. Установите Delayed::Worker.sleep_delay = 60
для 60 -секундного времени сна.
Можно отключить отсроченные задания в целях тестирования. Установить Delayed::Worker.delay_jobs = false
, чтобы выполнить все задания в реальном времени.
Или Delayed::Worker.delay_jobs
может быть Proc, который решает, выполнять ли задания встроенные на основе для каждого рабочего дня:
Задержка :: Worker.delay_jobs = -> (job) { job.queue! = 'inline'}
Вам может потребоваться поднять исключения в SIGTerm Signals, Delayed::Worker.raise_signal_exceptions = :term
приведет к тому, что работник поднимает SignalException
заставляя работать работа и разблокировать работу, что делает работу доступным для других работников. По умолчанию для этой опции неверно.
Вот пример изменения параметров работы в рельсах:
# config/initializers/doyeded_job_config.rbdelayed :: abryer.destroy_failed_jobs = falsedelayed :: korever.sleep_delay = 60delayed :: abrayer.max_attempts = 3delayed :: akerer.max_run_time = 5.minuteSdeLAYED _queue_name = 'default'delayed :: corker.delay_jobs =! Rails.env.test? Задержка :: abray.raise_signal_exceptions =: termdelayed :: abroger.logger = logger.new (file.join (rails.root,' log ',' doyed_job.log '))
Вы можете вызвать rake jobs:clear
, чтобы удалить все работы в очереди.
Хорошие места, чтобы получить помощь:
Группы Google, где вы можете присоединиться к нашему списку рассылки.
Stackoverflow