-
Notifications
You must be signed in to change notification settings - Fork 165
/
Copy pathsolid_queue_adapter.rb
49 lines (41 loc) · 1.26 KB
/
solid_queue_adapter.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# frozen_string_literal: true
module ActiveJob
module QueueAdapters
# == Active Job SolidQueue adapter
#
# To use it set the queue_adapter config to +:solid_queue+.
#
# Rails.application.config.active_job.queue_adapter = :solid_queue
class SolidQueueAdapter
def initialize(db_shard: nil)
@db_shard = db_shard
end
def enqueue_after_transaction_commit?
true
end
def enqueue(active_job) # :nodoc:
select_shard(active_job:) { SolidQueue::Job.enqueue(active_job) }
end
def enqueue_at(active_job, timestamp) # :nodoc:
select_shard(active_job:) do
SolidQueue::Job.enqueue(active_job, scheduled_at: Time.at(timestamp))
end
end
def enqueue_all(active_jobs) # :nodoc:
select_shard(active_jobs:) { SolidQueue::Job.enqueue_all(active_jobs) }
end
private
def select_shard(active_job: nil, active_jobs: nil, &block)
shard =
SolidQueue.shard_selection_lambda&.call(active_job:, active_jobs:) ||
@db_shard ||
SolidQueue.primary_shard
if shard
ActiveRecord::Base.connected_to(shard: shard) { block.call }
else
block.call
end
end
end
end
end