activejob-resque-disconnect 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +109 -0
- data/README.md +14 -0
- data/activejob-resque-disconnect.gemspec +32 -0
- data/lib/active_job/queue_adapters/resque_disconnect_adapter.rb +51 -0
- data/lib/version.rb +5 -0
- data/spec/job_wrapper_spec.rb +29 -0
- data/spec/resque_disconnect_adapter_spec.rb +28 -0
- data/spec/spec_helper.rb +20 -0
- metadata +170 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dc9af47d06d09561e4b9124c2d997eaa44d19d00
|
4
|
+
data.tar.gz: c29fe167d1ddb0ceba7641f4d3d8f1e9f6cc5b84
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d2a9ea10fd546914a395b6591f1c9c902ba99d10cc62b99a895f386980bdc0d1aa890864605d6338767efc825ab0accddf5d623f349a5f403f3ddd56d547c3eb
|
7
|
+
data.tar.gz: 5e10aec03c72d6fa5a1d0932dc6b6486f090a48caa621254fad10d9edd2349a98406a2391e7348202cd499cb28fcf6fc75e2f310e536d0b731490968a7a441d2
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
activejob-resque-disconnect (0.1.0)
|
5
|
+
activejob (>= 4.2)
|
6
|
+
activerecord (>= 4.2)
|
7
|
+
resque
|
8
|
+
resque-scheduler
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: https://rubygems.org/
|
12
|
+
specs:
|
13
|
+
activejob (4.2.0)
|
14
|
+
activesupport (= 4.2.0)
|
15
|
+
globalid (>= 0.3.0)
|
16
|
+
activemodel (4.2.0)
|
17
|
+
activesupport (= 4.2.0)
|
18
|
+
builder (~> 3.1)
|
19
|
+
activerecord (4.2.0)
|
20
|
+
activemodel (= 4.2.0)
|
21
|
+
activesupport (= 4.2.0)
|
22
|
+
arel (~> 6.0)
|
23
|
+
activesupport (4.2.0)
|
24
|
+
i18n (~> 0.7)
|
25
|
+
json (~> 1.7, >= 1.7.7)
|
26
|
+
minitest (~> 5.1)
|
27
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
28
|
+
tzinfo (~> 1.1)
|
29
|
+
arel (6.0.0)
|
30
|
+
ast (2.0.0)
|
31
|
+
astrolabe (1.3.0)
|
32
|
+
parser (>= 2.2.0.pre.3, < 3.0)
|
33
|
+
builder (3.2.2)
|
34
|
+
diff-lcs (1.2.5)
|
35
|
+
globalid (0.3.0)
|
36
|
+
activesupport (>= 4.1.0)
|
37
|
+
i18n (0.7.0)
|
38
|
+
json (1.8.2)
|
39
|
+
minitest (5.5.1)
|
40
|
+
mono_logger (1.1.0)
|
41
|
+
multi_json (1.10.1)
|
42
|
+
parser (2.2.0.2)
|
43
|
+
ast (>= 1.1, < 3.0)
|
44
|
+
powerpack (0.0.9)
|
45
|
+
rack (1.6.0)
|
46
|
+
rack-protection (1.5.3)
|
47
|
+
rack
|
48
|
+
rainbow (2.0.0)
|
49
|
+
rake (10.4.2)
|
50
|
+
redis (3.2.0)
|
51
|
+
redis-namespace (1.5.1)
|
52
|
+
redis (~> 3.0, >= 3.0.4)
|
53
|
+
resque (1.25.2)
|
54
|
+
mono_logger (~> 1.0)
|
55
|
+
multi_json (~> 1.0)
|
56
|
+
redis-namespace (~> 1.3)
|
57
|
+
sinatra (>= 0.9.2)
|
58
|
+
vegas (~> 0.1.2)
|
59
|
+
resque-scheduler (4.0.0)
|
60
|
+
mono_logger (~> 1.0)
|
61
|
+
redis (~> 3.0)
|
62
|
+
resque (~> 1.25)
|
63
|
+
rufus-scheduler (~> 3.0)
|
64
|
+
rspec (3.1.0)
|
65
|
+
rspec-core (~> 3.1.0)
|
66
|
+
rspec-expectations (~> 3.1.0)
|
67
|
+
rspec-mocks (~> 3.1.0)
|
68
|
+
rspec-core (3.1.7)
|
69
|
+
rspec-support (~> 3.1.0)
|
70
|
+
rspec-expectations (3.1.2)
|
71
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
72
|
+
rspec-support (~> 3.1.0)
|
73
|
+
rspec-its (1.1.0)
|
74
|
+
rspec-core (>= 3.0.0)
|
75
|
+
rspec-expectations (>= 3.0.0)
|
76
|
+
rspec-mocks (3.1.3)
|
77
|
+
rspec-support (~> 3.1.0)
|
78
|
+
rspec-support (3.1.2)
|
79
|
+
rubocop (0.28.0)
|
80
|
+
astrolabe (~> 1.3)
|
81
|
+
parser (>= 2.2.0.pre.7, < 3.0)
|
82
|
+
powerpack (~> 0.0.6)
|
83
|
+
rainbow (>= 1.99.1, < 3.0)
|
84
|
+
ruby-progressbar (~> 1.4)
|
85
|
+
ruby-progressbar (1.7.1)
|
86
|
+
rufus-scheduler (3.0.9)
|
87
|
+
tzinfo
|
88
|
+
sinatra (1.4.5)
|
89
|
+
rack (~> 1.4)
|
90
|
+
rack-protection (~> 1.4)
|
91
|
+
tilt (~> 1.3, >= 1.3.4)
|
92
|
+
thread_safe (0.3.4)
|
93
|
+
tilt (1.4.1)
|
94
|
+
tzinfo (1.2.2)
|
95
|
+
thread_safe (~> 0.1)
|
96
|
+
vegas (0.1.11)
|
97
|
+
rack (>= 1.0.0)
|
98
|
+
|
99
|
+
PLATFORMS
|
100
|
+
ruby
|
101
|
+
|
102
|
+
DEPENDENCIES
|
103
|
+
activejob-resque-disconnect!
|
104
|
+
rake (>= 10.3)
|
105
|
+
resque
|
106
|
+
resque-scheduler
|
107
|
+
rspec
|
108
|
+
rspec-its
|
109
|
+
rubocop
|
data/README.md
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# ActiveJob::QueueAdapters::ResqueDisconnectAdapter
|
2
|
+
|
3
|
+
ActiveJob adapter for Resque which disconnects when the worker has finished.
|
4
|
+
|
5
|
+
By default the connection will be left open until the database times it out, which eats up
|
6
|
+
database connections for no good reason.
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
require 'active_job/queue_adapters/resque_disconnect_adapter'
|
10
|
+
|
11
|
+
MyApp::Application.configure do
|
12
|
+
config.active_job.queue_adapter = ActiveJob::QueueAdapters::ResqueDisconnectAdapter
|
13
|
+
end
|
14
|
+
```
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.expand_path('../lib/version', __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'activejob-resque-disconnect'
|
5
|
+
s.version = ActiveJob::QueueAdapters::RESQUE_DISCONNECT_ADAPTER_VERSION
|
6
|
+
s.date = Date.today.strftime('%Y-%m-%d')
|
7
|
+
s.authors = ['Isaac Seymour']
|
8
|
+
s.email = ['isaac@isaacseymour.co.uk']
|
9
|
+
s.summary = 'ActiveJob Resque adapter which disconnects when the job is complete'
|
10
|
+
s.description = <<-EOL
|
11
|
+
If you're using ActiveRecord with Resque, a new database connection will get opened
|
12
|
+
for each worker process. When the worker completes, this connection is left open by
|
13
|
+
default, which is pretty bad. This adapter closes the connection when the job has_rdoc
|
14
|
+
finished executing.
|
15
|
+
EOL
|
16
|
+
s.homepage = 'http://github.com/gocardless/activejob-resque-disconnect'
|
17
|
+
s.license = 'MIT'
|
18
|
+
|
19
|
+
s.has_rdoc = false
|
20
|
+
s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
21
|
+
s.require_paths = %w(lib)
|
22
|
+
|
23
|
+
s.add_dependency('activejob', '>= 4.2')
|
24
|
+
s.add_dependency('activerecord', '>= 4.2')
|
25
|
+
s.add_dependency('resque')
|
26
|
+
s.add_dependency('resque-scheduler')
|
27
|
+
|
28
|
+
s.add_development_dependency('rake', ' >= 10.3')
|
29
|
+
s.add_development_dependency('rspec')
|
30
|
+
s.add_development_dependency('rspec-its')
|
31
|
+
s.add_development_dependency('rubocop')
|
32
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'resque'
|
2
|
+
require 'active_job'
|
3
|
+
require 'active_record'
|
4
|
+
require 'active_support/core_ext/enumerable'
|
5
|
+
require 'active_support/core_ext/array/access'
|
6
|
+
|
7
|
+
begin
|
8
|
+
require 'resque-scheduler'
|
9
|
+
rescue LoadError
|
10
|
+
begin
|
11
|
+
require 'resque_scheduler'
|
12
|
+
rescue LoadError
|
13
|
+
false
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module ActiveJob
|
18
|
+
module QueueAdapters
|
19
|
+
# == Resque adapter for Active Job which disconnects when the job is done
|
20
|
+
#
|
21
|
+
# require 'active_job/queue_adapters/resque_disconnect_adapter'
|
22
|
+
# Rails.application.config.active_job.queue_adapter = ActiveJob::QueueAdapters::ResqueDisconnectAdapter
|
23
|
+
class ResqueDisconnectAdapter
|
24
|
+
class << self
|
25
|
+
def enqueue(job)
|
26
|
+
Resque.enqueue_to(job.queue_name, JobWrapper, job.serialize)
|
27
|
+
end
|
28
|
+
|
29
|
+
def enqueue_at(job, timestamp)
|
30
|
+
unless Resque.respond_to?(:enqueue_at_with_queue)
|
31
|
+
raise NotImplementedError,
|
32
|
+
"To be able to schedule jobs with Resque you need the " \
|
33
|
+
"resque-scheduler gem. Please add it to your Gemfile and run bundle " \
|
34
|
+
"install"
|
35
|
+
end
|
36
|
+
Resque.enqueue_at_with_queue(job.queue_name, timestamp, JobWrapper, job.serialize)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class JobWrapper
|
41
|
+
class << self
|
42
|
+
def perform(job_data)
|
43
|
+
ActiveJob::Base.execute(job_data)
|
44
|
+
ensure
|
45
|
+
ActiveRecord::Base.connection.disconnect!
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/version.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe ActiveJob::QueueAdapters::ResqueDisconnectAdapter::JobWrapper do
|
4
|
+
subject(:perform) { described_class.perform(job_data) }
|
5
|
+
let(:job_data) { { 'job' => 'data' } }
|
6
|
+
|
7
|
+
let(:connection) { double(disconnect!: true) }
|
8
|
+
before { allow(ActiveJob::Base).to receive(:execute) }
|
9
|
+
before { allow(ActiveRecord::Base).to receive(:connection).and_return(connection) }
|
10
|
+
|
11
|
+
it "executes the job" do
|
12
|
+
expect(ActiveJob::Base).to receive(:execute).with('job' => 'data')
|
13
|
+
perform
|
14
|
+
end
|
15
|
+
|
16
|
+
it "disconnects from the database" do
|
17
|
+
expect(connection).to receive(:disconnect!)
|
18
|
+
perform
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when the job raises" do
|
22
|
+
before { expect(ActiveJob::Base).to receive(:execute).and_raise('hell') }
|
23
|
+
|
24
|
+
it "still disconnects" do
|
25
|
+
expect(connection).to receive(:disconnect!)
|
26
|
+
expect { perform }.to raise_error(RuntimeError, 'hell')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe ActiveJob::QueueAdapters::ResqueDisconnectAdapter do
|
4
|
+
let(:job) { double(queue_name: :queue, serialize: { 'job' => 'params' }) }
|
5
|
+
|
6
|
+
describe ".enqueue" do
|
7
|
+
subject(:enqueue) { described_class.enqueue(job) }
|
8
|
+
|
9
|
+
it "enqueues to Resque" do
|
10
|
+
expect(Resque).to receive(:enqueue_to).
|
11
|
+
with(:queue, described_class::JobWrapper, { 'job' => 'params' })
|
12
|
+
|
13
|
+
enqueue
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ".enqueue_at" do
|
18
|
+
subject(:enqueue_at) { described_class.enqueue_at(job, timestamp) }
|
19
|
+
let(:timestamp) { 'time to work' }
|
20
|
+
|
21
|
+
it "enqueues to Resque" do
|
22
|
+
expect(Resque).to receive(:enqueue_at_with_queue).
|
23
|
+
with(:queue, timestamp, described_class::JobWrapper, { 'job' => 'params' })
|
24
|
+
|
25
|
+
enqueue_at
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'active_job/queue_adapters/resque_disconnect_adapter'
|
2
|
+
require 'rspec/its'
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
config.expect_with :rspec do |expectations|
|
6
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
7
|
+
end
|
8
|
+
|
9
|
+
config.mock_with :rspec do |mocks|
|
10
|
+
mocks.verify_partial_doubles = true
|
11
|
+
end
|
12
|
+
|
13
|
+
config.disable_monkey_patching!
|
14
|
+
|
15
|
+
config.warnings = true
|
16
|
+
|
17
|
+
config.order = :random
|
18
|
+
|
19
|
+
Kernel.srand config.seed
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: activejob-resque-disconnect
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Isaac Seymour
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activejob
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: resque
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: resque-scheduler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '10.3'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '10.3'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec-its
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: |2
|
126
|
+
If you're using ActiveRecord with Resque, a new database connection will get opened
|
127
|
+
for each worker process. When the worker completes, this connection is left open by
|
128
|
+
default, which is pretty bad. This adapter closes the connection when the job has_rdoc
|
129
|
+
finished executing.
|
130
|
+
email:
|
131
|
+
- isaac@isaacseymour.co.uk
|
132
|
+
executables: []
|
133
|
+
extensions: []
|
134
|
+
extra_rdoc_files: []
|
135
|
+
files:
|
136
|
+
- Gemfile
|
137
|
+
- Gemfile.lock
|
138
|
+
- README.md
|
139
|
+
- activejob-resque-disconnect.gemspec
|
140
|
+
- lib/active_job/queue_adapters/resque_disconnect_adapter.rb
|
141
|
+
- lib/version.rb
|
142
|
+
- spec/job_wrapper_spec.rb
|
143
|
+
- spec/resque_disconnect_adapter_spec.rb
|
144
|
+
- spec/spec_helper.rb
|
145
|
+
homepage: http://github.com/gocardless/activejob-resque-disconnect
|
146
|
+
licenses:
|
147
|
+
- MIT
|
148
|
+
metadata: {}
|
149
|
+
post_install_message:
|
150
|
+
rdoc_options: []
|
151
|
+
require_paths:
|
152
|
+
- lib
|
153
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
|
+
requirements:
|
160
|
+
- - '>='
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: '0'
|
163
|
+
requirements: []
|
164
|
+
rubyforge_project:
|
165
|
+
rubygems_version: 2.4.1
|
166
|
+
signing_key:
|
167
|
+
specification_version: 4
|
168
|
+
summary: ActiveJob Resque adapter which disconnects when the job is complete
|
169
|
+
test_files: []
|
170
|
+
has_rdoc: false
|