delayed_job_ironmq 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.
- data/LICENSE +0 -0
- data/README.md +59 -0
- data/VERSION +1 -0
- data/lib/delayed/backend/actions.rb +75 -0
- data/lib/delayed/backend/iron_mq_config.rb +5 -0
- data/lib/delayed/backend/ironmq.rb +123 -0
- data/lib/delayed/backend/worker.rb +38 -0
- data/lib/delayed/serialization/ironmq.rb +6 -0
- data/lib/delayed_job_ironmq.rb +11 -0
- data/spec/.gitkeep +0 -0
- metadata +115 -0
data/LICENSE
ADDED
File without changes
|
data/README.md
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
This is [IronMQ](http://www.iron.io/products/mq) backend for [delayed_job](http://github.com/collectiveidea/delayed_job)
|
2
|
+
|
3
|
+
# Getting Started
|
4
|
+
|
5
|
+
## Get credentials
|
6
|
+
|
7
|
+
To start using delayed_job_ironmq, you need to sign up and get an oauth token.
|
8
|
+
|
9
|
+
1. Go to http://iron.io/ and sign up.
|
10
|
+
2. Get an Oauth Token at http://hud.iron.io/tokens
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
Add the gems to your `Gemfile:`
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
gem 'delayed_job'
|
18
|
+
gem 'delayed_job_ironmq'
|
19
|
+
```
|
20
|
+
|
21
|
+
And add an initializer (`config/initializers/delayed_job_config.rb`):
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
Delayed::Worker.configure do |config|
|
25
|
+
config.token = 'XXXXXXXXXXXXXXXX'
|
26
|
+
config.project_id = 'XXXXXXXXXXXXXXXX'
|
27
|
+
|
28
|
+
# optional params:
|
29
|
+
config.available_priorities = [-1,0,1,2] # Default is [0]. Please note, each new priority will speed down a bit picking job from queue
|
30
|
+
config.queue_name = 'default' # Specify an alternative queue name
|
31
|
+
config.delay = 0 # Time to wait before message will be available on the queue
|
32
|
+
config.timeout = 5.minutes # The time in seconds to wait after message is taken off the queue, before it is put back on. Delete before :timeout to ensure it does not go back on the queue.
|
33
|
+
config.expires_in = 7.days # After this time, message will be automatically removed from the queue.
|
34
|
+
end
|
35
|
+
end
|
36
|
+
```
|
37
|
+
|
38
|
+
## Usage
|
39
|
+
|
40
|
+
That's it. Use [delayed_job as normal](http://github.com/collectiveidea/delayed_job).
|
41
|
+
|
42
|
+
Example:
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
class TestJob < Struct.new(:a, :b)
|
46
|
+
def perform
|
47
|
+
puts a/b
|
48
|
+
end
|
49
|
+
end
|
50
|
+
Delayed::Job.enqueue TestJob.new(10, 2)
|
51
|
+
|
52
|
+
```
|
53
|
+
|
54
|
+
# Documentation
|
55
|
+
|
56
|
+
You can find more documentation here:
|
57
|
+
|
58
|
+
* http://iron.io
|
59
|
+
* http://dev.iron.io
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Delayed
|
2
|
+
module Backend
|
3
|
+
module Ironmq
|
4
|
+
module Actions
|
5
|
+
def field(name, options = {})
|
6
|
+
#type = options[:type] || String
|
7
|
+
default = options[:default] || nil
|
8
|
+
define_method name do
|
9
|
+
@attributes ||= {}
|
10
|
+
@attributes[name.to_sym] || default
|
11
|
+
end
|
12
|
+
define_method "#{name}=" do |value|
|
13
|
+
@attributes ||= {}
|
14
|
+
@attributes[name.to_sym] = value
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def before_fork
|
19
|
+
end
|
20
|
+
|
21
|
+
def after_fork
|
22
|
+
end
|
23
|
+
|
24
|
+
def db_time_now
|
25
|
+
Time.now.utc
|
26
|
+
end
|
27
|
+
|
28
|
+
#def self.queue_name
|
29
|
+
# Delayed::Worker.queue_name
|
30
|
+
#end
|
31
|
+
|
32
|
+
def find_available(worker_name, limit = 5, max_run_time = Worker.max_run_time)
|
33
|
+
Delayed::Worker.available_priorities.each do |priority|
|
34
|
+
messages = ironmq.messages.get(queue_name: queue_name(priority), n: limit)
|
35
|
+
jobs = messages.map do |message|
|
36
|
+
Delayed::Backend::Ironmq::Job.new(message)
|
37
|
+
end
|
38
|
+
return jobs if jobs.present?
|
39
|
+
end
|
40
|
+
[]
|
41
|
+
end
|
42
|
+
|
43
|
+
def delete_all
|
44
|
+
deleted = 0
|
45
|
+
Delayed::Worker.available_priorities.each do |priority|
|
46
|
+
loop do
|
47
|
+
msgs = ironmq.messages.get(n: 1000, queue_name: queue_name(priority))
|
48
|
+
break if msgs.blank?
|
49
|
+
msgs.each do |msg|
|
50
|
+
ironmq.messages.delete(msg.id, queue_name: queue_name(priority))
|
51
|
+
deleted += 1
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
puts "Messages removed: #{deleted}"
|
56
|
+
end
|
57
|
+
|
58
|
+
# No need to check locks
|
59
|
+
def clear_locks!(*args)
|
60
|
+
true
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def ironmq
|
66
|
+
::Delayed::Worker.ironmq
|
67
|
+
end
|
68
|
+
|
69
|
+
def queue_name(priority)
|
70
|
+
"#{Delayed::Worker.queue_name}_#{priority || 0}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Delayed
|
4
|
+
module Backend
|
5
|
+
module Ironmq
|
6
|
+
class Job
|
7
|
+
include ::DelayedJobIronmq::Document
|
8
|
+
include Delayed::Backend::Base
|
9
|
+
extend Delayed::Backend::Ironmq::Actions
|
10
|
+
|
11
|
+
field :priority, :type => Integer, :default => 0
|
12
|
+
field :attempts, :type => Integer, :default => 0
|
13
|
+
field :handler, :type => String
|
14
|
+
field :run_at, :type => Time
|
15
|
+
field :locked_at, :type => Time
|
16
|
+
field :locked_by, :type => String
|
17
|
+
field :failed_at, :type => Time
|
18
|
+
field :last_error, :type => String
|
19
|
+
field :queue, :type => String
|
20
|
+
|
21
|
+
def initialize(data = {})
|
22
|
+
puts "[init] Delayed::Backend::Ironmq"
|
23
|
+
@id = nil
|
24
|
+
if data.is_a?(IronMQ::Message)
|
25
|
+
@id = data.id
|
26
|
+
data = JSON.load(data.body)
|
27
|
+
end
|
28
|
+
|
29
|
+
data.symbolize_keys!
|
30
|
+
payload_obj = data.delete(:payload_object) || data.delete(:handler)
|
31
|
+
|
32
|
+
@queue_name = data[:queue_name] || Delayed::Worker.queue_name
|
33
|
+
@delay = data[:delay] || Delayed::Worker.delay
|
34
|
+
@timeout = data[:timeout] || Delayed::Worker.timeout
|
35
|
+
@expires_in = data[:expires_in] || Delayed::Worker.expires_in
|
36
|
+
@attributes = data
|
37
|
+
self.payload_object = payload_obj
|
38
|
+
end
|
39
|
+
|
40
|
+
def payload_object
|
41
|
+
@payload_object ||= YAML.load(self.handler)
|
42
|
+
rescue TypeError, LoadError, NameError, ArgumentError => e
|
43
|
+
raise DeserializationError,
|
44
|
+
"Job failed to load: #{e.message}. Handler: #{handler.inspect}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def payload_object=(object)
|
48
|
+
if object.is_a? String
|
49
|
+
@payload_object = YAML.load(object)
|
50
|
+
self.handler = object
|
51
|
+
else
|
52
|
+
@payload_object = object
|
53
|
+
self.handler = object.to_yaml
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def save
|
58
|
+
puts "[SAVE] #{@attributes.inspect}"
|
59
|
+
|
60
|
+
if @attributes[:handler].blank?
|
61
|
+
raise "Handler missing!"
|
62
|
+
end
|
63
|
+
payload = JSON.dump(@attributes)
|
64
|
+
|
65
|
+
ironmq.messages.delete(@id, queue_name: queue_name) if @id.present?
|
66
|
+
ironmq.messages.post(payload,
|
67
|
+
timeout: @timeout,
|
68
|
+
queue_name: queue_name,
|
69
|
+
delay: @delay,
|
70
|
+
expires_in: @expires_in)
|
71
|
+
true
|
72
|
+
end
|
73
|
+
|
74
|
+
def save!
|
75
|
+
save
|
76
|
+
end
|
77
|
+
|
78
|
+
def destroy
|
79
|
+
if @id
|
80
|
+
puts "job destroyed! #{@id.inspect}"
|
81
|
+
ironmq.messages.delete(@id, queue_name: queue_name) if @id.present?
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def fail!
|
86
|
+
destroy
|
87
|
+
# v2: move to separate queue
|
88
|
+
end
|
89
|
+
|
90
|
+
def update_attributes(attributes)
|
91
|
+
attributes.symbolize_keys!
|
92
|
+
@attributes.merge attributes
|
93
|
+
save
|
94
|
+
end
|
95
|
+
|
96
|
+
# No need to check locks
|
97
|
+
def lock_exclusively!(*args)
|
98
|
+
true
|
99
|
+
end
|
100
|
+
|
101
|
+
# No need to check locks
|
102
|
+
def unlock(*args)
|
103
|
+
true
|
104
|
+
end
|
105
|
+
|
106
|
+
def reload(*args)
|
107
|
+
# reset
|
108
|
+
super
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
def queue_name
|
114
|
+
"#{@queue_name}_#{@attributes[:priority] || 0}"
|
115
|
+
end
|
116
|
+
|
117
|
+
def ironmq
|
118
|
+
::Delayed::Worker.ironmq
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative 'iron_mq_config'
|
2
|
+
|
3
|
+
module Delayed
|
4
|
+
class Worker
|
5
|
+
class << self
|
6
|
+
attr_accessor :config, :ironmq,
|
7
|
+
:queue_name, :delay, :timeout, :expires_in, :available_priorities
|
8
|
+
|
9
|
+
def configure
|
10
|
+
yield(config)
|
11
|
+
if config && config.token && config.project_id
|
12
|
+
Delayed::Worker.ironmq = IronMQ::Client.new(
|
13
|
+
'token' => config.token,
|
14
|
+
'project_id' => config.project_id
|
15
|
+
)
|
16
|
+
self.queue_name = config.queue_name || 'default'
|
17
|
+
self.delay = config.delay || 0
|
18
|
+
self.timeout = config.timeout || 5.minutes
|
19
|
+
self.expires_in = config.expires_in || 7.days
|
20
|
+
|
21
|
+
priorities = config.available_priorities || [0]
|
22
|
+
if priorities.include?(0) && priorities.all?{|p|p.is_a?(Integer)}
|
23
|
+
self.available_priorities = priorities.sort
|
24
|
+
else
|
25
|
+
raise ArgumentError, "available_priorities option has wrong format. Please provide array of Integer values, includes zero. Default is [0]."
|
26
|
+
end
|
27
|
+
else
|
28
|
+
raise ArgumentError, "Required option missing. Please provide both 'token' and 'project_id'"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def config
|
33
|
+
@config ||= IronMqConfig.new
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'iron_mq'
|
3
|
+
require 'delayed_job'
|
4
|
+
|
5
|
+
require_relative 'delayed/serialization/ironmq'
|
6
|
+
require_relative 'delayed/backend/actions'
|
7
|
+
require_relative 'delayed/backend/iron_mq_config'
|
8
|
+
require_relative 'delayed/backend/worker'
|
9
|
+
require_relative 'delayed/backend/ironmq'
|
10
|
+
|
11
|
+
Delayed::Worker.backend = :ironmq
|
data/spec/.gitkeep
ADDED
File without changes
|
metadata
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: delayed_job_ironmq
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Alexander Shapiotko
|
9
|
+
- Iron.io, Inc
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2012-03-06 00:00:00.000000000Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: iron_mq
|
17
|
+
requirement: &36672804 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.4.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *36672804
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: delayed_job
|
28
|
+
requirement: &36672300 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 3.0.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *36672300
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: bundler
|
39
|
+
requirement: &36672000 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 1.0.0
|
45
|
+
type: :runtime
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *36672000
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rspec
|
50
|
+
requirement: &36671688 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '2.0'
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *36671688
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: jeweler
|
61
|
+
requirement: &36671388 !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ~>
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 1.8.3
|
67
|
+
type: :development
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: *36671388
|
70
|
+
description: IronMQ backend for delayed_job
|
71
|
+
email: info@iron.io
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files:
|
75
|
+
- LICENSE
|
76
|
+
- README.md
|
77
|
+
files:
|
78
|
+
- LICENSE
|
79
|
+
- README.md
|
80
|
+
- VERSION
|
81
|
+
- lib/delayed/backend/actions.rb
|
82
|
+
- lib/delayed/backend/iron_mq_config.rb
|
83
|
+
- lib/delayed/backend/ironmq.rb
|
84
|
+
- lib/delayed/backend/worker.rb
|
85
|
+
- lib/delayed/serialization/ironmq.rb
|
86
|
+
- lib/delayed_job_ironmq.rb
|
87
|
+
- spec/.gitkeep
|
88
|
+
homepage: http://www.iron.io
|
89
|
+
licenses: []
|
90
|
+
post_install_message:
|
91
|
+
rdoc_options: []
|
92
|
+
require_paths:
|
93
|
+
- lib
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
segments:
|
101
|
+
- 0
|
102
|
+
hash: -931014419
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
requirements: []
|
110
|
+
rubyforge_project:
|
111
|
+
rubygems_version: 1.8.11
|
112
|
+
signing_key:
|
113
|
+
specification_version: 3
|
114
|
+
summary: IronMQ backend for delayed_job
|
115
|
+
test_files: []
|