Sidekiq - забрать изменения БД, сделанные другим работником - PullRequest
0 голосов
/ 17 февраля 2020

В приложении Rails у меня есть project с, которые имеют много task с. task может иметь predecessor, который необходимо завершить до запуска задачи.

Я использую sidekiq для создания задач.

class ScheduleProjectJob < ApplicationJob
  queue_as :default

  def perform(project)
    tasks = Array(project.tasks)


    while !tasks.empty? do
      task = tasks.shift

      if task.without_predecessor? || task.predecessor_scheduled?
        ScheduleTaskJob.perform_later(task)
      else
        tasks << task
      end
    end
  end

I l oop через task s и запланировать задачу, если у нее нет предшественника или, если она есть, когда предшествующий уже был запланирован.

Чтобы проверить, было ли запланировано предшественника, я проверьте в базе данных, является ли состояние предшественника scheduled (задачи создаются с состоянием created и обновляются до scheduled в конце ScheduleTaskJob.

Проверка выполняется следующим образом

Task.joins(:task_template).
     where(%q(task_templates.dep_id = :dep AND
              task_templates.tag = :tag AND
              tasks.state = :state),
              specification_id: task_template.dep_id,
              tag: task_template.runs_after_tag,
              state: 'scheduled').
     count > 0

Приведенный выше запрос работает нормально, когда я вручную настраиваю БД и запускаю ее, однако, когда она запускается внутри ScheduleProjectJob, состояние предшествующей задачи всегда отображается как created, даже если я могу см. в БД значение в записи было обновлено до scheduled.

Я что-то здесь упускаю?

end

1 Ответ

1 голос
/ 17 февраля 2020

ActiveRecord кэширует результаты запроса, когда вы ожидаете, что результат запроса изменится, оберните ваш запрос:

ActiveRecord::Base.uncached do # or YourModel.uncached do
  some_query.count
end
...