我在使用Sidekiq时遇到了调用另一个worker的问题。 我的两个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也不会在数据库中更新用户。但当我将代码更改为以下内容时:
UserExportWorker将用户导出到某些外部服务,然后直接更新数据库中的用户状态列。这样做的话,就不需要使用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
我完全没有头绪…为什么这个不起作用呢?
UserExportStatusWorker
中的任务正在使用perform_in
被加入到队列中吗? - Anthonyretry: true
设置为真,并观察UI中的重试队列以查看作业是否失败。我使用Rollbar,但他推荐了一些其他的 - https://github.com/mperham/sidekiq/wiki/Error-Handling - Anthony