coney_island 0.10.2 → 0.10.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8ace26e15f62cea555f90b2d01df1c171a663bdd
4
- data.tar.gz: ac72a73cc54eef7b8ce0cf787bfd7cad67f7662c
3
+ metadata.gz: 22e0c2669707a9d1cc3ee045e95ca32039f5fcf6
4
+ data.tar.gz: 2ef3018f894f47115f0d0b2336e25156619765fc
5
5
  SHA512:
6
- metadata.gz: d62459ea99bf7d992555add7bd1659aac5fd2422b94d8ad6c0e20b5802481857e5708445bdfe29e0beb41335225429bdbb9c88fe6952bf2530ecd5cdf15b8370
7
- data.tar.gz: d7148fc33a739223600f3ba69e886c5054d011863b59304713d3933b7d2cd38a50e9943159ec8ca031fc6eb397f12af54eb6efa7be85d07d3bede9c8f4044f9f
6
+ metadata.gz: d8c14389f6cd4e1deffcb9c25474b1eb0833d4a79d61786276b2b0d37c1acf03fd21f73b012f2d321117f2664fb031a65a73d6fee0f55a7d57d938d56a88e48b
7
+ data.tar.gz: 52d86d4d9fed7ebcecc46f465f1dfb4c1563ae7b719bbbc7a2149404c71967f37e20f95e9bf1033b61ff7cf7a0b0a153ee524987f7823d8e634b3f07a1619a78
@@ -81,12 +81,7 @@ module ConeyIsland
81
81
  end
82
82
 
83
83
  def next_attempt_delay
84
- if self.delaying?
85
- time_delayed = (Time.now - self.delay_start).round
86
- new_delay = self.delay - time_delayed
87
- else
88
- ConeyIsland.delay_seed**(self.attempts - 1)
89
- end
84
+ ConeyIsland.delay_seed**(self.attempts - 1)
90
85
  end
91
86
 
92
87
  def resubmit_args
@@ -95,36 +90,10 @@ module ConeyIsland
95
90
  end
96
91
 
97
92
  def finalize_job
98
- metadata.ack if !self.acked? && !ConeyIsland.running_inline?
93
+ metadata.ack if !ConeyIsland.running_inline?
99
94
  log.info("finished job #{id}")
100
95
  ConeyIsland::Worker.running_jobs.delete self
101
96
  end
102
97
 
103
- def delaying?
104
- @delaying
105
- end
106
-
107
- def acked?
108
- @acked
109
- end
110
-
111
- def activate_after_delay
112
- @delaying = false
113
- ConeyIsland::Worker.delayed_jobs.delete self
114
- end
115
-
116
- def delay_job
117
- @delaying = true
118
- ConeyIsland::Worker.delayed_jobs << self
119
- unless ConeyIsland.running_inline?
120
- @acked = true
121
- metadata.ack
122
- end
123
- log.info("delaying job #{id} for #{self.delay} seconds")
124
- end
125
-
126
- def requeue_delay
127
- ConeyIsland.submit(self.klass, self.method_name, self.resubmit_args)
128
- end
129
98
  end
130
99
  end
@@ -51,10 +51,18 @@ module ConeyIsland
51
51
  end
52
52
  end
53
53
 
54
+ def self.channel
55
+ @channel
56
+ end
57
+
54
58
  def self.exchange
55
59
  @exchange
56
60
  end
57
61
 
62
+ def self.delay_exchange
63
+ @delay_exchange
64
+ end
65
+
58
66
  def self.amqp_parameters=(params)
59
67
  @amqp_parameters = params
60
68
  end
@@ -86,8 +94,10 @@ module ConeyIsland
86
94
  retry
87
95
  end
88
96
  else
89
- @channel ||= AMQP::Channel.new(@connection)
97
+ @channel ||= AMQP::Channel.new(@connection)
90
98
  @exchange = @channel.topic('coney_island')
99
+ @delay_exchange = @channel.topic('coney_island_delay')
100
+ @delay_queue = {}
91
101
  end
92
102
 
93
103
  def self.amqp_connection
@@ -104,18 +114,36 @@ module ConeyIsland
104
114
  job_args ||= {}
105
115
  job_args['klass'] = klass_name
106
116
  job_args['method_name'] = method_name
117
+ job_args.stringify_keys!
107
118
  if @run_inline
108
- job_args.stringify_keys!
109
119
  job = ConeyIsland::Job.new(nil, job_args)
110
120
  job.handle_job
111
121
  else
112
- work_queue = job_args.delete :work_queue
122
+ work_queue = job_args.delete 'work_queue'
113
123
  if klass.respond_to? :coney_island_settings
114
124
  work_queue ||= klass.coney_island_settings[:work_queue]
115
125
  end
116
126
  work_queue ||= 'default'
117
- self.exchange.publish(job_args.to_json, {routing_key: "carousels.#{work_queue}"}) do
118
- RequestStore.store[:jobs].delete job_id if RequestStore.store[:jobs] && job_id.present?
127
+ delay = job_args['delay']
128
+ if klass.respond_to? :coney_island_settings
129
+ delay ||= klass.coney_island_settings[:delay]
130
+ end
131
+ if delay && delay.to_i > 0
132
+ puts 'delaying...'
133
+ @delay_queue[work_queue] ||= {}
134
+ unless @delay_queue[work_queue][delay].present?
135
+ @delay_queue[work_queue][delay] ||= self.channel.queue(
136
+ work_queue + '_delayed_' + delay.to_s, auto_delete: false, durable: true,
137
+ arguments: {'x-dead-letter-exchange' => 'coney_island', 'x-message-ttl' => delay * 1000})
138
+ @delay_queue[work_queue][delay].bind(self.delay_exchange, routing_key: 'carousels.' + work_queue + ".#{delay}")
139
+ end
140
+ self.delay_exchange.publish(job_args.to_json, {routing_key: "carousels.#{work_queue}.#{delay}"}) do
141
+ RequestStore.store[:jobs].delete job_id if RequestStore.store[:jobs] && job_id.present?
142
+ end
143
+ else
144
+ self.exchange.publish(job_args.to_json, {routing_key: "carousels.#{work_queue}"}) do
145
+ RequestStore.store[:jobs].delete job_id if RequestStore.store[:jobs] && job_id.present?
146
+ end
119
147
  end
120
148
  end
121
149
  true
@@ -1,3 +1,3 @@
1
1
  module ConeyIsland
2
- VERSION = "0.10.2"
2
+ VERSION = "0.10.3"
3
3
  end
@@ -135,7 +135,7 @@ module ConeyIsland
135
135
 
136
136
  self.channel.prefetch @prefetch_count
137
137
  @queue = self.channel.queue(@full_instance_name, auto_delete: false, durable: true)
138
- @queue.bind(self.exchange, routing_key: 'carousels.' + @ticket)
138
+ @queue.bind(self.exchange, routing_key: 'carousels.' + @ticket + '.#')
139
139
  @queue.subscribe(:ack => true) do |metadata,payload|
140
140
  self.handle_incoming_message(metadata,payload)
141
141
  end
@@ -164,16 +164,7 @@ module ConeyIsland
164
164
  begin
165
165
  args = JSON.parse(payload)
166
166
  job = Job.new(metadata, args)
167
- if job.delay.present?
168
- self.delayed_jobs << job
169
- job.delay_job
170
- EventMachine.add_timer(job.delay) do
171
- job.activate_after_delay
172
- job.handle_job
173
- end
174
- else
175
- job.handle_job
176
- end
167
+ job.handle_job
177
168
  rescue Timeout::Error => e
178
169
  ConeyIsland.poke_the_badger(e, {code_source: 'ConeyIsland', job_payload: args, reason: 'timeout in subscribe code before calling job method'})
179
170
  rescue Exception => e
@@ -39,6 +39,7 @@ class ConeyIslandTest < MiniTest::Test
39
39
  ConeyIsland.tcp_connection_retry_interval = 0
40
40
  @fake_channel = MiniTest::Mock.new
41
41
  @fake_channel.expect :topic, nil, [String]
42
+ @fake_channel.expect :topic, nil, [String]
42
43
  AMQP::Channel.stub(:new,@fake_channel) do
43
44
  AMQP.stub(:connect, force_tcp_error) do
44
45
  ConeyIsland::Submitter.handle_connection
@@ -10,3 +10,15 @@ Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
10
10
  ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
11
11
  Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
12
12
  ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
13
+ undefined method `[]' for nil:NilClass
14
+ undefined method `[]' for nil:NilClass
15
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
16
+ Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
17
+ undefined method `[]' for nil:NilClass
18
+ undefined method `[]' for nil:NilClass
19
+ undefined method `[]' for nil:NilClass
20
+ Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
21
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
22
+ undefined method `[]' for nil:NilClass
23
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
24
+ Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
@@ -23,8 +23,6 @@ class PerformerTest < MiniTest::Test
23
23
  job.timeout.must_equal 10
24
24
  end
25
25
  it 'sets work queue for the class' do
26
- capture_publish = proc do |payload,options|
27
- end
28
26
  @exchange = Minitest::Mock.new
29
27
  def @exchange.publish(payload,options,&blk)
30
28
  ::PerformerTest.messages[:publish_hash] = options
@@ -32,15 +30,13 @@ class PerformerTest < MiniTest::Test
32
30
  ConeyIsland::Submitter.stub(:handle_connection, nil) do
33
31
  ConeyIsland::Submitter.stub(:exchange, @exchange) do
34
32
  ConeyIsland::Submitter.stop_running_inline
35
- ConeyIsland::Submitter.submit(MyPerformer, :add_to_list, args: [[]])
33
+ ConeyIsland::Submitter.submit(MyPerformer, :perform, args: [], delay: 0)
36
34
  end
37
35
  end
38
36
  @exchange.verify
39
37
  ::PerformerTest.messages[:publish_hash][:routing_key].must_equal "carousels.cyclone"
40
38
  end
41
39
  it 'overrides the class work queue with the job-level work queue' do
42
- capture_publish = proc do |payload,options|
43
- end
44
40
  @exchange = Minitest::Mock.new
45
41
  def @exchange.publish(payload,options,&blk)
46
42
  ::PerformerTest.messages[:publish_hash] = options
@@ -48,7 +44,7 @@ class PerformerTest < MiniTest::Test
48
44
  ConeyIsland::Submitter.stub(:handle_connection, nil) do
49
45
  ConeyIsland::Submitter.stub(:exchange, @exchange) do
50
46
  ConeyIsland::Submitter.stop_running_inline
51
- ConeyIsland::Submitter.submit(MyPerformer, :add_to_list, work_queue: 'boardwalk', args: [[]])
47
+ ConeyIsland::Submitter.submit(MyPerformer, :add_to_list, work_queue: 'boardwalk', args: [[]], delay: 0)
52
48
  end
53
49
  end
54
50
  @exchange.verify
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coney_island
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.2
4
+ version: 0.10.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Draut