Ruby on rails 如何检测延迟作业当前是否工作?
我有一个上传图片的表单。工作流程是,我将上传并保存一个图像,然后运行一个延迟作业,该作业将获取该图像并从中创建3个拇指 当我刷新页面时,我通常会看到拇指尚未创建,但过了一段时间(10-15秒)拇指就准备好了 但这不是很友好-我想向用户展示他的拇指正在创建中,但如何做到这一点 延迟的_jobs表的结构如下所示:Ruby on rails 如何检测延迟作业当前是否工作?,ruby-on-rails,ruby,methods,delay,delayed-job,Ruby On Rails,Ruby,Methods,Delay,Delayed Job,我有一个上传图片的表单。工作流程是,我将上传并保存一个图像,然后运行一个延迟作业,该作业将获取该图像并从中创建3个拇指 当我刷新页面时,我通常会看到拇指尚未创建,但过了一段时间(10-15秒)拇指就准备好了 但这不是很友好-我想向用户展示他的拇指正在创建中,但如何做到这一点 延迟的_jobs表的结构如下所示: create_table "delayed_jobs", :force => true do |t| t.integer "priority", :default
create_table "delayed_jobs", :force => true do |t|
t.integer "priority", :default => 0, :null => false
t.integer "attempts", :default => 0, :null => false
t.text "handler", :null => false
t.text "last_error"
t.datetime "run_at"
t.datetime "locked_at"
t.datetime "failed_at"
t.string "locked_by"
t.string "queue"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
@user.delay.activate!(@device)
job = Delayed::Job.enqueue(PhotoThumbnailJob.new(@user.id))
@user.thumbnail_job_id = job.id
我认为可以在这个表中添加一列,比如photo\u id,如果这个表中缺少相应的行,那么我就知道拇指已经准备好了。否则在队列中/正在创建
但是如何将这个额外的列保存到这个表中呢?当我调用delay方法时,它是这样的:
create_table "delayed_jobs", :force => true do |t|
t.integer "priority", :default => 0, :null => false
t.integer "attempts", :default => 0, :null => false
t.text "handler", :null => false
t.text "last_error"
t.datetime "run_at"
t.datetime "locked_at"
t.datetime "failed_at"
t.string "locked_by"
t.string "queue"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
@user.delay.activate!(@device)
job = Delayed::Job.enqueue(PhotoThumbnailJob.new(@user.id))
@user.thumbnail_job_id = job.id
如何传递照片的ID
谢谢在我构建的应用程序中,我需要类似的功能。我采用的方法是使用WebSocket在我的延迟作业进行时向用户发送状态更新。我之所以使用它,是因为API非常简单,对我们来说是免费的,但是任何实现,包括您自己的实现,都可以
否则,我将远离更改表,而是利用DelayedJob提供的各种钩子来启用回调功能,使您能够在作业的各个阶段执行任何您喜欢的操作。而不是将
照片id
存储在DelayedJobs
表中,您可以将作业id存储在照片
(或用户
)表中。为此,您需要编写如下作业类:
class PhotoThumbnailJob < Struct.new(:user_id)
def perform
# generate the thumbnail
end
end
现在只要你有@user,你就可以得到这份工作。这样你就可以知道它是失败了还是还没有完成,如果失败了,你可以报告原因,等等
请注意,如果执行此操作,可能需要在缩略图_job_id上创建外键约束,并在删除作业时告诉它将该列设为null,因为默认情况下,DJ将从延迟的_jobs表中删除成功的作业