1

我使用延遲作業在我的應用程序中執行後臺任務。它做了一些東西然後發送郵件。這是代碼塊作爲延遲作業執行的示例。使用延遲作業在郵件程序中引發的MissingTemplate異常

def task 
# do stuff 
AppMailer.post.some_template(@variable) 
end 

這一直工作正常,我在正確的目錄some_template.text.plain.erb的模板。我已經開始看到這會引發一個MissingTemplate異常,並且這會停止延遲的作業,並在給定時間後再次嘗試(如延遲作業中引發異常時預期的那樣)。有些情況下會失敗2或3次,然後成功交付,其他​​情況下不會引發異常情況。一個模板如何不存在,然後在下次嘗試中找到成功?

錯誤正在尋找模板.erb是造成此問題的plain.text.erb。任何想法爲什麼這會導致間歇性問題?我曾嘗試在救援塊中包裝發送郵件,因爲我不想發送郵件而不是發起異常。

def task 
# do stuff 
begin 
AppMailer.post.some_template(@variable) 
rescue ActionView::MissingTemplate => e 
# do stuff 
end 
end 

但異常仍然上升。延遲工作是否會做任何可能阻止這個救援塊運作的事情?

這裏是堆棧跟蹤

Error: 
    Missing template app_mailer/some_template.erb in view path app/views:vendor/plugins/tolk/app/views 
    /data/app/shared/bundled_gems/ruby/1.8/gems/actionpack-2.3.14/lib/action_view/paths.rb:74:in `find_template' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/actionpack-2.3.14/lib/action_view/base.rb:264:in `render' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/actionmailer-2.3.14/lib/action_mailer/base.rb:600:in `render' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/actionmailer-2.3.14/lib/action_mailer/base.rb:586:in `render_message' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/actionmailer-2.3.14/lib/action_mailer/base.rb:526:in `create!' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/actionmailer-2.3.14/lib/action_mailer/base.rb:485:in `initialize' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/actionmailer-2.3.14/lib/action_mailer/base.rb:427:in `new' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/actionmailer-2.3.14/lib/action_mailer/base.rb:427:in `method_missing' 
    /data/app/releases/20121127213524/app/models/mail_delivery.rb:55:in `send' 
    /data/app/releases/20121127213524/app/models/mail_delivery.rb:55:in `serialize_mail' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:178:in `send' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:178:in `evaluate_method' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:166:in `call' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:93:in `run' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:92:in `each' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:92:in `send' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:92:in `run' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:276:in `run_callbacks' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/callbacks.rb:344:in `callback' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/callbacks.rb:265:in `create' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/base.rb:2927:in `create_or_update_without_callbacks' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/callbacks.rb:250:in `create_or_update' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/base.rb:2577:in `save_without_validation' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/validations.rb:1089:in `save_without_dirty' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/dirty.rb:79:in `save_without_transactions' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/transactions.rb:229:in `send' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/transactions.rb:229:in `with_transaction_returning_status' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/transactions.rb:182:in `transaction_without_trace_ActiveRecord_self_name_transaction' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/newrelic_rpm-3.4.0.1/lib/new_relic/agent/method_tracer.rb:491:in `transaction' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/newrelic_rpm-3.4.0.1/lib/new_relic/agent/method_tracer.rb:242:in `trace_execution_scoped' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/newrelic_rpm-3.4.0.1/lib/new_relic/agent/method_tracer.rb:486:in `transaction' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/transactions.rb:228:in `with_transaction_returning_status' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/transactions.rb:196:in `save' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/transactions.rb:208:in `rollback_active_record_state!' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/transactions.rb:196:in `save' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.14/lib/active_record/base.rb:727:in `create' 
    /data/app/releases/20121127213524/app/models/mail_delivery.rb:88:in `method_missing' 
    /data/app/releases/20121127213524/lib/job_manifest.rb:670:in `notify_user_of_upload_without_audit' 
    /data/app/releases/20121127213524/lib/job_manifest.rb:6:in `send' 
    /data/app/releases/20121127213524/lib/job_manifest.rb:6:in `notify_user_of_upload_with_audit' 
    /data/app/releases/20121127213524/lib/job_manifests/app_send_job.rb:43:in `notify_user_of_upload' 
    /data/app/releases/20121127213524/lib/job_manifests/app_send_job.rb:43:in `extended' 
    /data/app/releases/20121127213524/lib/job_manifest.rb:102:in `preflight_completed_changed_delayed' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/performable_method.rb:35:in `send' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/performable_method.rb:35:in `perform' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/backend/base.rb:74:in `invoke_job' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/worker.rb:122:in `run' 
    /usr/lib64/ruby/1.8/timeout.rb:67:in `timeout' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/worker.rb:122:in `run' 
    /usr/lib64/ruby/1.8/benchmark.rb:308:in `realtime' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/worker.rb:121:in `run' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/worker.rb:173:in `reserve_and_run_one_job' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/worker.rb:106:in `work_off' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/worker.rb:105:in `times' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/worker.rb:105:in `work_off' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/worker.rb:80:in `start' 
    /usr/lib64/ruby/1.8/benchmark.rb:308:in `realtime' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/worker.rb:79:in `start' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/worker.rb:76:in `loop' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/worker.rb:76:in `start' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/delayed_job-2.0.7/lib/delayed/command.rb:100:in `run' 
    (eval):1 
    /data/app/current/script/runner:3:in `eval' 
    /data/app/shared/bundled_gems/ruby/1.8/gems/rails-2.3.14/lib/commands/runner.rb:48 
    /data/app/current/script/runner:3:in `require' 
    /data/app/current/script/runner:3 

我知道有幾個問題在這裏,但任何意見,將不勝感激。

回答

2

很難從只是說你貼什麼,但遲發性工作梅勒錯誤,我通常會檢查兩件事情:

  1. 這在部署新的代碼你的工人正在重新啓動,從而使他們正在使用您的應用程序的最新版本。

  2. 您傳遞給Mailer方法的參數用於檢索記錄嗎?如果是這樣,請小心,記錄不會在正在創建的作業和正在工作的作業之間改變或消失。如果是這種情況,請考慮傳入準確構建郵件所需的屬性。

+0

感謝您的回答,我有一個部署鉤子,重新啓動工作人員(之前在我的開發環境中發現的東西),所以不應該成爲問題。但我確實通過了一個可以檢索記錄的參數。你是否認爲這可能會導致MissingTemplate錯誤,如果我試圖在同一時間訪問它? – cih

+0

很難說。我敢打賭,錯誤是基於創建和工作之間的數據變化。這可以解釋爲什麼有時可以使用它而不使用其他的。 –

+0

用這個圈子圍着圈子發現,儘管部署鉤子重新啓動了工作人員,但仍有一些工作人員運行舊版本的代碼。解釋爲什麼我會看到間歇性問題。雖然這兩個版本的代碼中的模板是相同的,所以不要那麼做!殺了他們,似乎已經解決了問題,乾杯! – cih