job 中 discard_on,retry_on和 rescue_from的应用
class OrdersRefundJob < ApplicationJob
queue_as :default
discard_on Exceptions::CustomException
retry_on ActiveRecord::RecordNotFound, wait: 2.seconds, attempts: 3
rescue_from Exceptions::InvalidAction do
service = AfterSaleService.find(arguments[0])
service.update!(is_refunding: false)
end
def perform(service_id)
service = AfterSaleService.find(service_id)
service.refund
end
end
相关测试
require 'rails_helper'
RSpec.describe OrdersRefundJob, type: :job do
it 'auto refund the aftersale order' do
@order = create(:order, :paid)
expect(@order.status).to eq('paid')
expect(service.status).to eq('initial')
OrdersRefundJob.perform_now(service.id)
expect(@order.reload.status).to eq('closed')
expect(service.reload.status).to eq('finished')
end
it 'retry on ActiveRecord::RecordNotFound' do
ActiveJob::Base.queue_adapter.enqueued_jobs.clear
expect do
OrdersRefundJob.perform_now(nil)
end.not_to raise_error(ActiveRecord::RecordNotFound)
expect(enqueued_jobs.size).to eq(1)
job_detail = enqueued_jobs.find { |job| job[:job] == OrdersRefundJob }
expect(job_detail).to be_present
end
end