From 5cad2c1b8aa1139ba3de45b3ce26b9d5c9931f6c Mon Sep 17 00:00:00 2001 From: Cristian Bica Date: Tue, 20 May 2014 00:01:56 +0300 Subject: Implemented queue_classic adapter --- Gemfile | 1 + Gemfile.lock | 4 ++++ README.md | 4 ++-- Rakefile | 4 ++-- .../queue_adapters/queue_classic_adapter.rb | 20 ++++++++++++++++++++ test/adapters/queue_classic.rb | 2 ++ test/support/queue_classic/inline.rb | 11 +++++++++++ 7 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 lib/active_job/queue_adapters/queue_classic_adapter.rb create mode 100644 test/adapters/queue_classic.rb create mode 100644 test/support/queue_classic/inline.rb diff --git a/Gemfile b/Gemfile index 9f74b017f0..550da15615 100644 --- a/Gemfile +++ b/Gemfile @@ -7,3 +7,4 @@ gem 'resque' gem 'sidekiq' gem 'sucker_punch' gem 'delayed_job' +gem 'queue_classic' diff --git a/Gemfile.lock b/Gemfile.lock index 849ccf6634..c1df0ebc36 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -31,6 +31,9 @@ GEM minitest (5.3.4) mono_logger (1.1.0) multi_json (1.9.3) + pg (0.17.1) + queue_classic (2.2.3) + pg (~> 0.17.0) rack (1.5.2) rack-protection (1.5.2) rack @@ -70,6 +73,7 @@ PLATFORMS DEPENDENCIES activejob! delayed_job + queue_classic rake resque sidekiq diff --git a/README.md b/README.md index da73276e84..a0e5f01e29 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ of the request-response cycle, so the user doesn't have to wait on it. The main point is to ensure that all Rails apps will have a job infrastructure in place, even if it's in the form of an "immediate runner". We can then have framework features and other gems build on top of that, without having to worry -about API differences between Delayed Job and Resque. Picking your queuing +about API differences between Delayed Job and Resque. Picking your queuing backend becomes more of an operational concern, then. And you'll be able to switch between them without having to rewrite your jobs. @@ -83,10 +83,10 @@ We currently have adapters for: * Sidekiq * Sucker Punch * Delayed Job +* QueueClassic We would like to have adapters for: -* QueueClassic * Sneakers diff --git a/Rakefile b/Rakefile index 5242926c7f..2b8b81248d 100644 --- a/Rakefile +++ b/Rakefile @@ -20,11 +20,11 @@ task :default => :test desc 'Run all adapter tests' task :test do - tasks = %w(test_inline test_resque test_sidekiq test_sucker_punch test_delayed_job) + tasks = %w(test_inline test_resque test_sidekiq test_sucker_punch test_delayed_job test_queue_classic) run_without_aborting(*tasks) end -%w(inline resque sidekiq sucker_punch delayed_job).each do |adapter| +%w(inline resque sidekiq sucker_punch delayed_job queue_classic).each do |adapter| Rake::TestTask.new("test_#{adapter}") do |t| t.libs << 'test' t.test_files = FileList['test/cases/**/*_test.rb'] diff --git a/lib/active_job/queue_adapters/queue_classic_adapter.rb b/lib/active_job/queue_adapters/queue_classic_adapter.rb new file mode 100644 index 0000000000..e3392a646e --- /dev/null +++ b/lib/active_job/queue_adapters/queue_classic_adapter.rb @@ -0,0 +1,20 @@ +require 'queue_classic' + +module ActiveJob + module QueueAdapters + class QueueClassicAdapter + class << self + def queue(job, *args) + qc_queue = QC::Queue.new(job.queue_name) + qc_queue.enqueue("ActiveJob::QueueAdapters::QueueClassicAdapter::JobWrapper.perform", job, *args) + end + end + + class JobWrapper + def self.perform(job, *args) + job.new.perform *Parameters.deserialize(args) + end + end + end + end +end diff --git a/test/adapters/queue_classic.rb b/test/adapters/queue_classic.rb new file mode 100644 index 0000000000..ad5ced3cc2 --- /dev/null +++ b/test/adapters/queue_classic.rb @@ -0,0 +1,2 @@ +require 'support/queue_classic/inline' +ActiveJob::Base.queue_adapter = :queue_classic diff --git a/test/support/queue_classic/inline.rb b/test/support/queue_classic/inline.rb new file mode 100644 index 0000000000..5e9c295e01 --- /dev/null +++ b/test/support/queue_classic/inline.rb @@ -0,0 +1,11 @@ +require 'queue_classic' + +module QC + class Queue + def enqueue(method, *args) + receiver_str, _, message = method.rpartition('.') + receiver = eval(receiver_str) + receiver.send(message, *args) + end + end +end -- cgit v1.2.3