ActiveAsync aims to provide an interface for easily setting up ActiveRecord objects and ruby classes to run methods asynchronously.
ActiveAsync currently depends on ActiveSupport.
In your Gemfile
gem "activeasync"
Or via command line
gem install activeasync
Configure one of the supported adapters: :sidekiq
, :resque
, or :inline
(useful for testing synchronously).
# config/initializers/activeasync.rb
require "active_async"
ActiveAsync.queue_adapter = :sidekiq
Background class methods
class HeavyLifter
include ActiveAsync::Async
def self.lift(*stuff)
# heavy lifting
end
end
HeavyLifter.async(:lift, 1, 2, 3)
With ActiveRecord and Rails
# app/models/risky_business.rb
class RiskyBusiness < ActiveRecord::Base
def party_time
# all night long
end
end
business = RiskyBusiness.last
business.async(:party_time) # runs business#party_time asynchronously
Run callbacks asynchronously
class LateNite < ActiveRecord::Base
after_save :drive_home, :async => true
def drive_home
# traffic jam
end
end
late_nite = LateNite.last
late_nite.save # runs late_night#drive_home asynchronously after save
ActiveAsync comes with some helpers support for RSpec.
To remove Resque dependency from some of your specs, use the :stub_resque option in selected spec blocks. Async methods will run in the foreground.
# spec/spec_helper.rb
require 'active_async/rspec'
# spec/models/late_nite_spec.rb
it "drive home after late nite save", :stub_resque do
# all methods run in foreground
end
You can also manually set the Async background adapter to ActiveAsync::FakeResque
or
any similar module/class that responds to #enqueue(*args)
:
before do
ActiveAsync.queue_adapter = :inline
end
To contribute to activeasync, clone the project and submit pull requests in a branch with tests.
To run tests, install the bundle and migrate the test database:
$ bundle
$ cd spec/sample && bundle exec rake db:migrate db:test:prepare