我想在后台执行一些任务,但有点像“run as”。换句话说,就像用户从他的会话环境中启动了一个任务。
像
这样的东西def perform
env['warden'].set_user(@task_owner_user)
MyService::current_user_dependent_method
end
但我不确定它是否会与其他任务发生冲突。我对Sidekiq不太熟悉。 我可以安全地执行单独的任务,每个任务都有不同的用户上下文吗?
答案 0 :(得分:2)
我不确定您使用“run as”上下文拍摄的是什么,但我总是通过在表演中传递id来设置需要唯一对象的sidekiq作业。通过这种方式,工作人员始终知道它正在尝试处理哪个对象。也许这就是你要找的东西?
def perform id
user = User.find(id)
user.current_user_dependent_method
end
然后在控制器中设置路径以触发此工作人员启动,例如:
def custom_route_for_performing_job
@users= User.where(your_conditions)
@users.each do |user|
YourWorker.perform_async user.id
end
redirect_to :back, notice: "Starting background job for users_dependent_method"
end
答案 1 :(得分:1)
正确的设计是使用服务器端中间件+线程局部变量来设置每个作业的当前用户上下文。
class MyServerMiddlware
def call(worker, message, queue)
Thread.current[:current_user] = message['uid'] if message['uid']
yield
ensure
Thread.current[:current_user] = nil
end
end
您将创建一个客户端中间件来捕获当前的uid并将其放入消息中。通过这种方式,逻辑被明确地封装在任何一种类型的Worker中。阅读更多: