2011-01-14 38 views
5

Đang cố gắng để xếp hàng một công việc với delayed_job như sau:ngoại lệ Weird với delayed_job

Delayed::Job.enqueue(BackgroundProcess.new(current_user, object)) 

CURRENT_USER và đối tượng không phải là con số không khi tôi in chúng ra. Điều kỳ lạ là đôi khi làm mới trang hoặc chạy lệnh lại hoạt động!

Dưới đây là ngoại lệ dấu vết:

Delayed::Backend::ActiveRecord::Job Columns (44.8ms) SHOW FIELDS FROM `delayed_jobs` 

TypeError (wrong argument type nil (expected Data)): 
    /Users/.rvm/rubies/ruby-1.9.1-p378/lib/ruby/1.9.1/yaml.rb:391:in `emit' 
    /Users/.rvm/rubies/ruby-1.9.1-p378/lib/ruby/1.9.1/yaml.rb:391:in `quick_emit' 
    /Users/.rvm/rubies/ruby-1.9.1-p378/lib/ruby/1.9.1/yaml/rubytypes.rb:86:in `to_yaml' 
    vendor/plugins/delayed_job/lib/delayed/backend/base.rb:65:in `payload_object=' 
    activerecord (2.3.9) lib/active_record/base.rb:2918:in `block in assign_attributes' 
    activerecord (2.3.9) lib/active_record/base.rb:2914:in `each' 
    activerecord (2.3.9) lib/active_record/base.rb:2914:in `assign_attributes' 
    activerecord (2.3.9) lib/active_record/base.rb:2787:in `attributes=' 
    activerecord (2.3.9) lib/active_record/base.rb:2477:in `initialize' 
    activerecord (2.3.9) lib/active_record/base.rb:725:in `new' 
    activerecord (2.3.9) lib/active_record/base.rb:725:in `create' 
    vendor/plugins/delayed_job/lib/delayed/backend/base.rb:21:in `enqueue' 

Trả lời

7

Tôi đoán rằng nó được gây ra bởi thực tế là bạn gửi các đối tượng làm đối số cho công việc của bạn (ít nhất là tôi cho rằng CURRENT_USER và đối tượng là trong các đối tượng thực tế và không phải của id). Thay vào đó, hãy gửi id và bắt đầu bằng cách tải các đối tượng khi bắt đầu thực hiện.

Ví dụ:

Delayed::Job.enqueue(BackgroundProcess.new(current_user.id, object.id)) 

class BackgroundProcess < Struct.new(:user_id, :object_id) 
    def perform 
    @current_user = User.find(user_id) 
    @object = Object.find(object_id) 

    ... 
    end 
end 

Bằng cách này, nó không có nguy cơ bất kỳ vấn đề với serializing một ActiveRecord vào cơ sở dữ liệu và bạn sẽ luôn nạp những thay đổi mới nhất khi công việc được chạy.

+0

Cảm ơn rất nhiều điều này đã giải quyết được vấn đề của tôi – Tam

+0

Việc tuần tự hóa đối tượng gốc không phải là điều khủng khiếp. Người ta phải luôn luôn kéo lại một bản sao mới trong khi trong công việc; tuy nhiên, nó cung cấp cho bạn tùy chọn xem bản sao trước của hồ sơ nếu cần. – Nick

0

Cũng gặp vấn đề tương tự. Tôi vẫn không biết những gì đang gây ra nó, nhưng đối với một số lý do nhân bản đối tượng dường như để giải quyết nó

u = User.find 123 
u.to_yaml 
=> TypeError: wrong argument type nil (expected Data) 
u.clone.to_yaml 
=> works like normal 

Rất bực bội. Sẽ là tốt hơn để biết nguyên nhân gốc rễ, nhưng điều này có thể giúp đỡ nếu bạn đang tuyệt vọng.

Các vấn đề liên quan