job 中 discard_on,retry_on和 rescue_from的应用
class OrdersRefundJob < ApplicationJobqueue_as :defaultdiscard_on Exceptions::CustomException retry_on ActiveRecord::RecordNotFound, wait: 2.seconds, attempts: 3rescue_from Exceptions::InvalidAction doservice = AfterSaleService.find(arguments[0])service.update!(is_refunding: false)enddef perform(service_id)service = AfterSaleService.find(service_id)service.refundend
end
相关测试
require 'rails_helper'RSpec.describe OrdersRefundJob, type: :job doit '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')endit 'retry on ActiveRecord::RecordNotFound' doActiveJob::Base.queue_adapter.enqueued_jobs.clearexpect doOrdersRefundJob.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_presentend
end