如何检测延迟的工作目前是否正常工作?

时间:2014-01-24 23:55:27

标签: ruby-on-rails ruby methods delay delayed-job

我有一个表单,我通过它上传图片。工作流程是,我将上传并保存图像,然后运行延迟作业,这将拍摄此图像,并将从中创建3个拇指。

当我刷新页面时,我通常会看到拇指还没有创建,但过了一会儿(10-15秒)就准备好了。

但这不是很友好 - 我想向用户展示他的拇指正在创作,但该怎么做?

delayed_jobs 表的结构如下:

  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

我认为可行的方法是在此表中添加一个列,例如 photo_id ,如果此表中缺少相应的行,那么我会知道拇指已准备就绪。否则在队列中/正在创建。

但是如何将这个额外的列保存到此表中?当我调用延迟方法时,就像这样:

@user.delay.activate!(@device)

如何传递照片的 ID

由于

2 个答案:

答案 0 :(得分:1)

您可以将作业ID存储在photo_id(或delayed_jobs)表中,而不是将photos存储在users表中。为此,您需要编写一个Job类,如下所示:

class PhotoThumbnailJob < Struct.new(:user_id)

  def perform
    # generate the thumbnail
  end

end

然后像这样得到对作业实例的引用:

job = Delayed::Job.enqueue(PhotoThumbnailJob.new(@user.id))
@user.thumbnail_job_id = job.id

现在只要你拥有@user就可以获得这份工作。这样你可以判断它是否失败或者还没有完成,如果失败你可以报告原因等。

请注意,如果执行此操作,您可能希望在thumbnail_job_id上创建外键约束,并在删除作业时将其指示为空列,因为默认情况下DJ将从delayed_jobs表中删除成功的作业。

答案 1 :(得分:0)

我在我构建的应用程序中需要类似的功能。我采用的方法是使用WebSockets在我的DelayedJob作业进度时向用户发送状态更新。我使用Pusher,因为API很简单,对我们来说是免费的,但任何实现,包括您自己的实现都可以。

否则,我会远离更改表格,而是利用DelayedJob提供的各种钩子来启用回调功能,让您在工作的不同阶段采取您喜欢的任何操作。