Resque::Plugins::Async::Method

Make Active Record instance methods asynchronous using resque.

Works with Ruby ~> 1.9, Rails ~> 3 and Resque ~> 1.17. (Probably works with earlier versions too -- but why?)

Usage

class User < ActiveRecord::Base
  # Not needed! This is done using a hook on ActiveRecord::Base.
  # include Resque::Plugins::Async::Method

  def process_avatar
    # do stuff
  end
  async_method :process_avatar

end

u = User.find(1)

u.process_avatar # => queued in 'users' queue

# You can call previous method in sync mode by :
u.sync_process_avatar # => happens right away!

Note that in the test environment, none of this magic happens. You can test the expected output immediately.

Method return values will change. Resque.enqueue will return [] from an async'ed method.

In Module extension

Sometimes it's nice to async a method that you're including from a module:

module MyExtension
  extend ActiveSupport::Concern

  include Resque::Plugins::Async::Method

  included do
    async_method :generate_matrix, queue: 'matrices'
  end

  def generate_matrix
    # do stuff
  end
end

Concurrently protection

You can protect for concurrently processing in background

For this, you must indicate which classes should not make any treatment concurrently :

class User < ActiveRecord::Base
    ...

   def process_avatar
    # do stuff
  end
  async_method :process_avatar, loner: true

end

You can also set a timeout in seconds, when you pass key :lock_timeout the key :loner is useless but you can set it anyway.

class User < ActiveRecord::Base
    ...

   def process_avatar
    # do stuff
  end
  async_method :process_avatar, lock_timeout: 3600

end

Changelog

  • 1.3: Technical enhancement, switch to plugin resque-lock-timeout
  • 1.2: Add flaging system
  • 1.1.1: Switch to Rspec test suite.
  • 1.0.1: Update for latest Resque API (true returned from successful queue)
  • 1.0.0: Initial release