目前我正在使用delayed_job处理pdf文件,我需要知道文件是否已被处理。
完成后,我需要更改数据库中的值,以通知用户他们的文件已正确处理。
我使用delayed_job与mongoid和paperclip作为处理器。
答案 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>