gpt4 book ai didi

ruby-on-rails - 使用 sidekiq 在另一个 worker 内部调用 worker ,

转载 作者:太空宇宙 更新时间:2023-11-03 16:45:33 26 4
gpt4 key购买 nike

我在使用 sidekiq 调用另一个工作人员内部的工作人员时遇到问题。我有两个看起来像这样的 worker :

class UserExportWorker
include Sidekiq::Worker

sidekiq_options queue: :users, unique: true, retry: false

def perform(user_id)
# code that exports user to external service via API
UserExportStatusWorker.perform_in(1.minute, user_export_id, user_id)
end
end

class UserExportStatusWorker
include Sidekiq::Worker

sidekiq_options queue: :users, unique: true, retry: false

def perform(user_export_id, user_id)
# code that check if exporting user to external service via API is finished
if export.completed?
user.update(status: 'exported')
else
UserExportStatusWorker.perform_in(1.minute, user_export_id, user_id)
end
end
end

UserExportWorker 通过 API 将用户导出到一些外部服务并运行 UserExportStatusWorker 将检查外部 API 中的导出是否已完成,如果未完成则它将再次启动同一个工作程序,当导出完成时它将更新用户状态列数据库。问题是即使成功导出到外部 API,UserExportStatusWorker 也不会更新数据库中的用户。但是当我将代码更改为:

class UserExportWorker
include Sidekiq::Worker

sidekiq_options queue: :users, unique: true, retry: false

def perform(user_id)
# code that exports user to external service via API
UserExportStatusWorker.new.perform(user_export_id, user_id)
end
end

class UserExportStatusWorker
include Sidekiq::Worker

sidekiq_options queue: :users, unique: true, retry: false

def perform(user_export_id, user_id)
# code that check if exporting user to external service via API is finished
if export.completed?
user.update(status: 'exported')
else
UserExportStatusWorker.new.perform(user_export_id, user_id)
end
end
end

我完全没有想法...为什么这行不通?

最佳答案

理想情况下,要在 Worker 上重启,您应该引发错误,并让 sidekiq 重试它,如 docs 中所述.

因此在您的情况下,在您的 UserExportWorker 类中您可以有一个方法来检查导出是否成功运行,如果没有成功,则引发自定义 ExportNotSuccessfulError

关于ruby-on-rails - 使用 sidekiq 在另一个 worker 内部调用 worker ,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33426064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com