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?)
class User < ActiveRecord::Base
# Not needed! This is done using a hook on ActiveRecord::Base.
# include Resque::Plugins::Async::Method
def preprocess_avatar_for_a_long_time
# do stuff
end
async_method :preprocess_avatar_for_a_long_time
def send_a_very_long_email
# do stuff
end
async_method :send_a_very_long_email, queue: 'emails'
end
u = User.find(1)
u.preprocess_avatar_for_a_long_time # => queued in 'users' queue
u.send_a_very_long_email # => queued in 'emails' queue
u.sync_send_a_very_long_email # => 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.
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
- 1.0.1: Update for latest Resque API (true returned from successful queue)
- 1.0.0: Initial release