Skip to content

Instantly share code, notes, and snippets.

View pmatsinopoulos's full-sized avatar
💻
Programming

Panos Matsinopoulos pmatsinopoulos

💻
Programming
View GitHub Profile
# frozen_string_literal: true
module EnqueueableJob
extend ActiveSupport::Concern
included do
def process_enqueued_job(queueable:)
enqueued_job = nil
ActiveRecord::Base.transaction do
@pmatsinopoulos
pmatsinopoulos / long_running_batch_job.rb
Created April 13, 2025 05:00
Long Running Batch Job Framework
class LongRunningBatchJob < ApplicationJob
queue_as :default
include EnqueueableJob
def perform(batch_id)
batch = Batch.find(batch_id)
process_enqueued_job(queueable: batch) do
# do the long running batch job
@pmatsinopoulos
pmatsinopoulos / enqeueue_job_using_queueable_api.rb
Last active April 12, 2025 16:53
Enqueue a Job using Queuable API
# frozen_string_literal: true
module Queueable
extend ActiveSupport::Concern
included do
def enqueue(job_class_name:, schedule_options: {})
result = false
ActiveRecord::Base.transaction do
@pmatsinopoulos
pmatsinopoulos / enqueued_job.rb
Created April 12, 2025 16:39
EnqueuedJob model
class EnqueuedJob < ApplicationRecord
belongs_to :queueable, polymorphic: true
end
@pmatsinopoulos
pmatsinopoulos / calculate_user_job_with_advisory_lock_job.rb
Last active April 12, 2025 15:48
Calculate User Job with Advisory Locks
ADVISORY_LOCK_NAMESPACES = {
create_user_job: 1
}
class CreateUserJob < ApplicationJob
queue_as :default
def perform(user_email)
ActiveRecord::Base.transaction do
# LOCKING >
class CreateUserJob < ApplicationJob
queue_as :default
def perform(user_email)
puts "************** #{provider_job_id} About to create user: #{user_email}"
found = User.find_by(email: user_email)
return if found
class CalculateUserBalanceJob < ApplicationJob
queue_as :default
def perform(user_id)
User.transaction do
user = User.lock.find(user_id)
puts "************** #{provider_job_id} Calculating balance for user: #{user.email}"
user_balance = user.user_balance
class CalculateUserBalanceJob < ApplicationJob
queue_as :default
def perform(user_id)
user = User.find(user_id)
puts "Calculating balance for user: #{user.email}"
user_balance = user.user_balance
@pmatsinopoulos
pmatsinopoulos / gist:e40e2265cbfa65f4b20c577310c604a6
Created April 12, 2025 10:00
5 Sidekiq Jobs Using #increment
user = User.find_by!(email: "[email protected]")
puts "Initial user_balance: #{user.user_balance.balance}"
5.times do
CalculateUserBalanceJob.perform_later(user.id)
end
sleep(60) # just wait for the background job to finish. This is long enough
# for all the 5 Sidekiq jobs to finish
@pmatsinopoulos
pmatsinopoulos / using_increment.rb
Created April 12, 2025 09:55
Using #increment!
class CalculateUserBalanceJob < ApplicationJob
queue_as :default
def perform(user_id)
user = User.find(user_id)
puts "#{Thread.current.object_id} -> Calculating balance for user: #{user.email}"
user_balance = user.user_balance