在铁轨上延迟工作,如何知道何时处理?

时间:2014-08-20 18:05:59

标签: ruby-on-rails mongoid paperclip delayed-job

目前我正在使用delayed_job处理pdf文件,我需要知道文件是否已被处理。

完成后,我需要更改数据库中的值,以通知用户他们的文件已正确处理。

我使用delayed_job与mongoid和paperclip作为处理器。

3 个答案:

答案 0 :(得分:1)

我尝试了这个回调,但它确实有效:

# config/intializers/delayed_paperclip
    module DelayedPaperclip
      module Jobs
        class DelayedJob

          def success
            # here comes database change value
          end

        end
      end
    end

但问题是我无法引用此作业的父级来获取对象ID并将数据库值更改为processed = true。

这是作业对象,没有父参考:

{
    "_id" : ObjectId("53f504e06d696e5fc5010000"),
    "priority" : 0,
    "attempts" : 0,
    "queue" : null,
    "handler" : "--- !ruby/struct:DelayedPaperclip::Jobs::DelayedJob\ninstance_klass: Note\ninstance_id: !ruby/object:BSON::ObjectId\n  raw_data: !binary |-\n    U/UE321pbl/FAAAA\nattachment_name: :file\n",
    "run_at" : ISODate("2014-08-20T20:28:16.178Z"),
    "updated_at" : ISODate("2014-08-20T20:28:16.178Z"),
    "created_at" : ISODate("2014-08-20T20:28:16.178Z")
}

我如何参考工作的创建者?

还有其他解决方案吗? (显然是的,我想)

谢谢,

答案 1 :(得分:0)

您应该能够简单地定义一个方法,该方法首先处理pdf,然后更改数据库值或通知用户并将其作为延迟作业运行。

答案 2 :(得分:0)

我最近遇到了类似的问题,尽管我的代码使用了不同的作业执行惯例。它不使用Job类,而是使用延迟方法,例如myobj.report.delay.generate_downloaded_version

因为myobj被序列化为YAML所以你需要的所有内容都隐藏在处理程序中,因此:

irb(main):018:0> job = Delayed::Job.find("53c64778bd19836c5f00009b")
irb(main):020:0> YAML::load(job.handler)
=> #<Delayed::PerformableMethod:0x7f6a569d4230 @object=#<Analysis::Report _id: 53b161c2bd198338cb000030, analysis_id: BSON::ObjectId('53b143f4bd19835c96000016'), created_at: Mon Jun 30 13:10:26 UTC 2014, updated_at: Wed Jul 16 12:31:11 UTC 2014, validator_ids: ["links"], page_patern: "*", _type: nil, pages: nil, entries: [], report_type: "detail", message_levels: ["errors", "warnings"], locale: "pl", state: "enqueued">, @args=[], @method_name=:generate_downloaded_version>
irb(main):021:0>