Skip to content

Instantly share code, notes, and snippets.

@amkisko
Last active August 25, 2022 12:13
Show Gist options
  • Select an option

  • Save amkisko/cad9b0a9aaa62552fda29d573dd9339c to your computer and use it in GitHub Desktop.

Select an option

Save amkisko/cad9b0a9aaa62552fda29d573dd9339c to your computer and use it in GitHub Desktop.
ActiveJob extension for checking if sidekiq job is running or awaiting in queues
# filepath: app/lib/sidekiq_running.rb
# source_url: https://github.com/eljojo/sidekiq-running
# usage: `include ActiveJobSidekiqRunning` to job class
module ActiveJobSidekiqRunning
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def running?(id: nil, args: nil, kwargs: nil)
workers = Sidekiq::Workers.new
workers.to_a.any? do |worker_name, tid, job|
payload = job["payload"]
next if !payload
job_args = payload["args"].first
same_job?(job_args:, id:, args:, kwargs:)
end
end
def scheduled?(id: nil, args: nil, kwargs: nil)
Sidekiq::ScheduledSet.new.any? do |job|
same_job?(job_args: job.args.first, id:, args:, kwargs:)
end
end
def queued?(id: nil, args: nil, kwargs: nil)
Sidekiq::Queue.new(queue_name).any? do |job|
same_job?(job_args: job.args.first, id:, args:, kwargs:)
end
end
def queued_to_retry?(id: nil, args: [], kwargs: {})
Sidekiq::RetrySet.new.any? do |job|
same_job?(job_args: job.args.first, id:, args:, kwargs:)
end
end
def running_or_awaiting?(id: nil, args: [], kwargs: {})
running?(id:, args:, kwargs:) ||
scheduled?(id:, args:, kwargs:) ||
queued?(id:, args:, kwargs:) ||
queued_to_retry?(id:, args:, kwargs:)
end
def transform_arguments(*args, **kwargs)
ActiveJob::Arguments.serialize([
args,
Hash.ruby2_keywords_hash(kwargs)
].compact.flatten)
end
def arguments_equal?(args:, kwargs:, job_arguments:)
transform_arguments(*args, **kwargs) == job_arguments
end
def same_job?(job_args:, id:, args:, kwargs:)
job_args.fetch("job_class") == self.name &&
(id.blank? || id == job_args.fetch("job_id")) &&
(args.blank? && kwargs.blank? || arguments_equal?(args:, kwargs:, job_arguments: job_args.fetch("arguments")))
end
end
end
@vesan

vesan commented Aug 22, 2022

Copy link
Copy Markdown

@amkisko

amkisko commented Aug 22, 2022

Copy link
Copy Markdown
Author

@vesan it's not relevant anymore...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment