Rails Activestorage和sidekiq:为什么.attach不能使用异步作业



我在sidekiq作业中使用此方法:

def attach_poster(poster_url,obj)
resp = HTTParty.get(poster_url)
file = Tempfile.new
begin
file.binmode
file.write(resp.body)
file.rewind
obj.poster.attach(io: file, filename: "poster.png")
ensure
file.close
file.unlink
end
end

只有当我用.perform_inline开始作业时,这才有效,如下所示:ImportJob.perform_inline(poster_url,obj)当我使用.perform_async时,文件没有正确附加,这会导致FileNotFoundError。为什么?

我想使用perform_async,以便作业从主进程异步运行。

我使用的是Ubuntu 20.04,Rails和Sidekiq的最新版本。

我认为这里的问题是,在文件完全上传之前,作业已排队,因此出现ActiveStorage::FileNotFound错误。

我认为这个猴子补丁在这种情况下会对你有所帮助。(我从下面github上的评论中复制了代码,让你更容易,但这要归功于对这个问题发表评论的人)。

还有另一个stackoverflow问题,并且已经用相同的解决方案进行了回答->此处

这里的另一个问题是如何使ActiveStorage::Attached#attach函数同步运行->此处

希望这能有所帮助,如果你有任何其他问题,请告诉我,我非常乐意提供帮助。

module ActiveStorage::Blob::Analyzable
def analyze_later
analyze
end
end

最新更新