Skip to content
This repository

Additional sidekiq middleware

README.md

Additional sidekiq middleware

Gem Version Dependency Status Code Climate Build Status Coverage Status

This gem provides additional middleware for Sidekiq.

See Sidekiq Wiki for more details.

Installation

Add this line to your application's Gemfile:

gem 'sidekiq-middleware'

And then execute:

$ bundle

Or install it yourself as:

$ gem install sidekiq-middleware

Contents

UniqueJobs

Provides uniqueness for jobs.

Usage

Example worker:

class UniqueWorker
  include Sidekiq::Worker

  sidekiq_options({
    # Should be set to true (enables uniqueness for async jobs)
    # or :all (enables uniqueness for both async and scheduled jobs)
    unique: :all,

    # Unique expiration (optional, default is 30 minutes)
    # For scheduled jobs calculates automatically based on schedule time and expiration period
    expiration: 24 * 60 * 60
  })

  def perform
    # Your code goes here
  end
end

Custom lock key and manual expiration:

class UniqueWorker
  include Sidekiq::Worker

  sidekiq_options({
    unique: :all,
    expiration: 24 * 60 * 60,

    # Set this to true when you need to handle locks manually.
    # You'll be able to handle unique expiration inside your worker.
    # Please see example below.
    manual: true
  })

  # Implement your own lock string
  def self.lock(id)
    "locks:unique:#{id}"
  end

  # Implement method to handle lock removing manually
  def self.unlock!(id)
    lock = self.lock(id)
    Sidekiq.redis { |conn| conn.del(lock) }
  end

  def perform(id)
    # Your code goes here
    # You are able to re-schedule job from perform method,
    # Just remove lock manually before performing job again.
    sleep 5

    # Re-schedule!
    self.class.unlock!(id)
    self.class.perform_async(id)
  end
end

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Added some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request
Something went wrong with that request. Please try again.