2010-12-05 24 views
5

Tôi cố gắng đăng nhập từ trong một delay_job trong đường ray.Đăng nhập từ bên trong collectiveidea/delay_job

tôi cấu hình nó như sau:

Delayed::Worker.destroy_failed_jobs = false 
Delayed::Worker.max_attempts = 3 
Delayed::Worker.backend = :active_record 
Delayed::Worker.logger = ActiveSupport::BufferedLogger.new("log/#{Rails.env}_delayed_jobs.log", Rails.logger.level) 
Delayed::Worker.logger.auto_flushing = 1 

Xác định công việc của tôi:

class TestJob 

    def initialize(user) 
     @user = user 
    end 


    #called when enqueue is performed 
    def enqueue(job) 
     Delayed::Worker.logger.info("TestJob: enqueue was called") 
    end 

    def perform 
     Delayed::Worker.logger.info("\n\n\n\nTestJob: in perform, for user #{@user.twitter_username}") 
    end 
end 

Nhưng khi tôi gọi enquee về công việc của tôi

Delayed::Job.enqueue(TestJob.new(user), 2) 

Các tệp nhật ký vẫn trống rỗng, thậm chí mặc dù bảng delay_jobs cho thấy công việc đã được thực hiện.

Bất kỳ ý tưởng nào?

+1

Dường như bạn không đơn độc: http://stackoverflow.com/questions/3500200/getting-delayed-job-to-log –

Trả lời

0

Hãy dùng thử mà không sử dụng không gian tên của DJ.

Đây là mã từ công việc tôi đã sử dụng cách đây một thời gian. Lưu ý: Logger.new sẽ chỉ nối thêm vào tệp .log nếu tệp đã tồn tại.

class ScrapingJob < Struct.new(:keyword_id) 
    def perform 
     begin 
     ... 
     rescue => error 
     log = Logger.new("#{Rails.root}/log/scraping_errors.log") 
     log.debug "logger created for '#{keyword.text}' (#{keyword.id}) on '#{keyword.website.url}' (#{keyword.website.id})" 
     log.debug "time: #{measured_at.to_s(:short)}" 
     log.debug "error: #{error}" 
     log.debug "" 
     end 
    end 
    end 
0

Tôi đoán đây là sự cố serialization với DJ cố gắng sắp xếp thứ tự đối tượng User. DJ làm một công việc tồi tệ trong việc nâng cao những lỗi đó.

Bạn có đang sử dụng Mongoid không? Tôi biết có vấn đề ở đó với JSONizing một đối tượng Mongoid.

Tính năng này có hoạt động nếu bạn chuyển chuỗi user_id đến Công việc, thay vì đối tượng Người dùng không? giống như vậy ...

class TestJob 

    def initialize(user_id) 
     @user = User.find(user_id) 
    end 

    # ... 

end 

Mặc dù nó không đẹp, tôi nghĩ thực hành tốt nhất để truyền các chữ (Strings, Floats, v.v ...) sang DelayedJob hoặc bất kỳ nhân viên nào. Điều này giúp dễ dàng trao đổi người xử lý trong trường hợp bạn muốn di chuyển sang Resque trong tương lai.

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