2016-10-17 3 views
2
class A 
    .... 
    def something 
    if condition 
     mark_completed 
     // here I can see the object progress is completed 
     CompletionStatsWorker.perform_async(self.id) 
    end 
    end 

    def mark_completed 
    self.update_attributes!(progress: 'completed') 
    end 
end 

В работника:Sidekiq получает противоречивые данные

class CompletionStatsWorker 
    include Sidekiq::Worker 

    def perform(id) 
    obj = A.find(id) 
    //here I'm getting the progress of the same object as 'progressing' 
    end 
end 

Sidekiq каким-то образом получает старые данные, даже если он запускается после успешного поля Updation. Я вижу, что объект updated_at не совпадает с фактическим значением updated_at. Пожалуйста, помогите

ответ

2

это может происходит потому, что sidekiq работает быстрее, чем поручены к БД, вы должны добавить CompletionStatsWorker.perform_async(self.id) к after_commit обратного вызова или метод изменения в:

def something 
    if condition 
     if mark_completed 
     // here I can see the object progress is completed 
     CompletionStatsWorker.perform_async(self.id) 
     end 
    end 
    end 

посмотрите sidekiq docs

+0

Эй Олег, I» вы пробовали оба. Странно, что прогресс завершен, прежде чем я назову рабочего. Но внутри рабочего он снова показывает статус как прогрессирующий. Но в db он завершен сам. –

+0

вы можете попробовать, просто для проверки, после метода 'mark_completed' добавьте' sleep 1'. То же самое в этом случае? –

Смежные вопросы