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