6 actionmailer sidekiq ruby-on-rails-4 rails-activejob
我正在使用ActionMailer deliver_later w ActiveJobs/Sidekiq使用:
config.active_job.queue_adapter = :sidekiq
Run Code Online (Sandbox Code Playgroud)
因为我在dev模式下测试了MailCatcher,我能捕到的唯一错误是Errno :: ECONNREFUSED,设置端口1026而不是1025
当我测试deliver_now时,我得到了Errno :: ECONNREFUSED错误,这很好
begin
MessageMailer.contact_me_email(@message).deliver_now
rescue Errno::ECONNREFUSED, Net::SMTPAuthenticationError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Net::SMTPFatalError, Net::SMTPUnknownError => e
flash[:error] = "Problems sending mail. Please try again later"
# delete message or resend it ?
byebug
@message.destroy
format.html { render :new }
end
Run Code Online (Sandbox Code Playgroud)
但是,当我请求deliver_later时,请求在sidekiq邮件程序队列中很痛,并且没有捕获错误...
begin
MessageMailer.contact_me_email(@message).deliver_later(wait: 1.minute ) # in mailers queue
rescue Errno::ECONNREFUSED, Net::SMTPAuthenticationError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Net::SMTPFatalError, Net::SMTPUnknownError => e
flash[:error] = "Problems sending mail. Please try again later"
# delete message or resend it ?
byebug
@message.destroy
format.html { render :new }
end
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如何从SMTP错误中捕获和解救?我想Sidekiq有责任处理它......任何暗示欢迎......
bre*_*dan 12
ActiveJobs允许您挽救使用该rescue_from方法执行作业时发生的错误.见api.您需要在ActiveJob子类中实现此方法.
由于ActionMailer使用DeliveryJobs将消息作为作业传递,因此您需要将rescue_from方法添加到此类以处理异常.
例如,您可以放入config/initializers/action_mailer.rb:
ActionMailer::DeliveryJob.rescue_from(StandardError) do |exception|
Rails.logger.error "Original record not found: #{@serialized_arguments.join(', ')}"
end
Run Code Online (Sandbox Code Playgroud)
这将彻底拯救任何StandardErrors,只需记录它们而不是引发异常.我自己实现了这个以安静Rollbar.
因为它是一个极端情况,所以测试它也是个好主意:
spec/initializers/action_mailer_spec.rb:
RSpec.describe 'ActionMailer::DeliveryJob error recovery' do
it 'should log the deserialization errors' do
@user = create(:user)
MyCustomMailer.send_something(@user).deliver_later
@user.destroy
expect(Rails.logger).to receive(:error).at_least(:once)
Delayed::Worker.new.work_off
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1621 次 |
| 最近记录: |