由于简单的Struct,Delayed_Job任务失败

时间:2012-10-15 09:58:01

标签: ruby-on-rails delayed-job

我在rails应用程序中使用delayed_job时遇到了麻烦。如果我试图通过Struct传递一个简单的(整数)id,我的工作就会失败。这就是现在的工作方式:

  class EventJob < Struct.new(:event_id)
    def perform
      # TODO
    end
  end

到目前为止,表演的主体是空的。我在执行这样的工作时遇到以下失败错误:

Delayed::Job.enqueue(EventJob.new(1))

这是错误信息:

Job failed to load: undefined method `members' for #. Handler: "--- !ruby/struct:EventJob \nevent_id: 1\n"
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/backend/base.rb:86:in `rescue in payload_object'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/backend/base.rb:84:in `payload_object'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/backend/base.rb:94:in `block in invoke_job'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `call'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `block in initialize'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `call'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `execute'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:38:in `run_callbacks'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/backend/base.rb:91:in `invoke_job'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:182:in `block (2 levels) in run'
C:/Ruby193/lib/ruby/1.9.1/timeout.rb:68:in `timeout'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:182:in `block in run'
C:/Ruby193/lib/ruby/1.9.1/benchmark.rb:295:in `realtime'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:181:in `run'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:238:in `block in reserve_and_run_one_job'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `call'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `block in initialize'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `call'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `execute'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:38:in `run_callbacks'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:238:in `reserve_and_run_one_job'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:166:in `block in work_off'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:165:in `times'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:165:in `work_off'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:133:in `block (4 levels) in start'
C:/Ruby193/lib/ruby/1.9.1/benchmark.rb:295:in `realtime'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:132:in `block (3 levels) in start'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `call'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `block in initialize'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `call'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `execute'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:38:in `run_callbacks'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:129:in `block (2 levels) in start'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:128:in `loop'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:128:in `block in start'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/plugins/clear_locks.rb:7:in `call'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/plugins/clear_locks.rb:7:in `block (2 levels) in '
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:78:in `call'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:78:in `block (2 levels) in add'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `call'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `block in initialize'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:78:in `call'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:78:in `block in add'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `call'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `execute'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:38:in `run_callbacks'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/worker.rb:127:in `start'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/delayed_job-3.0.3/lib/delayed/tasks.rb:9:in `block (2 levels) in '
C:/Ruby193/lib/ruby/1.9.1/rake/task.rb:205:in `call'
C:/Ruby193/lib/ruby/1.9.1/rake/task.rb:205:in `block in execute'
C:/Ruby193/lib/ruby/1.9.1/rake/task.rb:200:in `each'
C:/Ruby193/lib/ruby/1.9.1/rake/task.rb:200:in `execute'
C:/Ruby193/lib/ruby/1.9.1/rake/task.rb:158:in `block in invoke_with_call_chain'
C:/Ruby193/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
C:/Ruby193/lib/ruby/1.9.1/rake/task.rb:151:in `invoke_with_call_chain'
C:/Ruby193/lib/ruby/1.9.1/rake/task.rb:144:in `invoke'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:116:in `invoke_task'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:94:in `block (2 levels) in top_level'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:94:in `each'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:94:in `block in top_level'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:133:in `standard_exception_handling'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:88:in `top_level'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:66:in `block in run'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:133:in `standard_exception_handling'
C:/Ruby193/lib/ruby/1.9.1/rake/application.rb:63:in `run'
C:/Ruby193/bin/rake:32:in `'

如果我删除了Struct.new(:event_id),它正在执行peform方法。奇怪的是我没有一种叫做“成员”的方法。但Struct有一个名为members的方法。在delayed_job和Struct之间是否存在某种兼容性问题?

谢谢!

2 个答案:

答案 0 :(得分:0)

我相信你的YAML引擎会有些奇怪。检查YAML :: Parser常量是什么。它应该是Psych :: Parser。 你应该能够执行:

YAML.load "--- !ruby/struct:EventJob \nevent_id: 1\n"
在你的irb控制台中

答案 1 :(得分:0)

好的,不知道是什么原因导致了这个问题。我刚刚回到我的项目的旧备份版本,现在它似乎再次工作。对不起,我不能提供任何更详细的信息,除非它在某个地方打破了。