action_subscriber 2.4.0-java → 2.5.0.pre2-java

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4f88273356427bd1dd6eb0a7193439582c4459a3
4
- data.tar.gz: 1e7dbaf3d4910fa57f2827d9813f283b96f40b4c
3
+ metadata.gz: 2c6194a3af9eae1c2d4cf5334ac776096f8f2941
4
+ data.tar.gz: 688438729925400473d45c00ca9d721381ed659b
5
5
  SHA512:
6
- metadata.gz: 0f22d17d74aa6ad323d72c531668e47e4b19d003ada7c4b4a2a315ad4c252a6336dc27aad123360939370da80b9f6fb10d4c5168da07d94eaaa7e9754a16151c
7
- data.tar.gz: dc5dff440bc611ddbc5124baf8023ec44cc0cebf39c1127d32d66d9a836c61c27b266f6a21516987c4a578e09649b32764aaacddf0ca7e2bccb4cdd295308721
6
+ metadata.gz: dbfad9bf2929bc5e91fa5c17db51d8704bf26dcd63c6cbf90010043317d240cc48b1efa8ccf48f59c9c30b4aec0846dc8de9b5cc4cb33a3f4243ad7e2d37be91
7
+ data.tar.gz: c3d530b87d242352a5066f7ae91661ff0ea313556feccc4f40b5040367f703c33c4ac037160d9d47d4d09c995dc5e038307774451ffc72a4307f27e95454ebb0
@@ -1,13 +1,10 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9
4
- - 2.0
5
- - 2.1
6
- - 2.2
7
- - jruby-1.7
3
+ - 2.2.4
4
+ - 2.3.0
8
5
  - jruby-9.0.4.0
6
+ - jruby-9.1.5.0
9
7
  - jruby-head
10
- - rbx-2
11
8
  services:
12
9
  - rabbitmq
13
10
  sudo: false
@@ -15,4 +12,3 @@ cache: bundler
15
12
  matrix:
16
13
  allow_failures:
17
14
  - rvm: jruby-head
18
- - rvm: rbx-2
@@ -27,6 +27,7 @@ require "action_subscriber/march_hare/subscriber"
27
27
  require "action_subscriber/babou"
28
28
  require "action_subscriber/publisher"
29
29
  require "action_subscriber/publisher/async"
30
+ require "action_subscriber/synchronizer"
30
31
  require "action_subscriber/route"
31
32
  require "action_subscriber/route_set"
32
33
  require "action_subscriber/router"
@@ -61,17 +61,73 @@ module ActionSubscriber
61
61
  end
62
62
 
63
63
  def _at_least_once_filter
64
+ processed_acknowledgement = false
64
65
  yield
65
- acknowledge
66
+ processed_acknowledgement = acknowledge
66
67
  rescue => error
67
68
  ::ActionSubscriber::MessageRetry.redeliver_message_with_backoff(env)
68
- acknowledge
69
+ processed_acknowledgement = acknowledge
69
70
  raise error
71
+ ensure
72
+ rejected_message = false
73
+ rejected_message = reject unless processed_acknowledgement
74
+
75
+ if !processed_acknowledgement && !rejected_message
76
+ Process.kill(:TTIN, Process.pid)
77
+ Process.kill(:USR2, Process.pid)
78
+
79
+ $stdout << <<-UNREJECTABLE
80
+ CANNOT ACKNOWLEDGE OR REJECT THE MESSAGE
81
+
82
+ This is a exceptional state for ActionSubscriber to enter and puts the current
83
+ Process in the position of "I can't get new work from RabbitMQ, but also
84
+ can't acknowledge or reject the work that I currently have" ... While rare
85
+ this state can happen.
86
+
87
+ Instead of continuing to try to process the message ActionSubscriber is
88
+ sending a Kill signal to the current running process to gracefully shutdown
89
+ so that the RabbitMQ server will purge any outstanding acknowledgements. If
90
+ you are running a process monitoring tool (like Upstart) the Subscriber
91
+ process will be restarted and be able to take on new work.
92
+
93
+ ** Running a process monitoring tool like Upstart is recommended for this reason **
94
+ UNREJECTABLE
95
+
96
+ Process.kill(:TERM, Process.pid)
97
+ end
70
98
  end
71
99
 
72
100
  def _at_most_once_filter
73
- acknowledge
101
+ processed_acknowledgement = false
102
+ processed_acknowledgement = acknowledge
74
103
  yield
104
+ ensure
105
+ rejected_message = false
106
+ rejected_message = reject unless processed_acknowledgement
107
+
108
+ if !processed_acknowledgement && !rejected_message
109
+ Process.kill(:TTIN, Process.pid)
110
+ Process.kill(:USR2, Process.pid)
111
+
112
+ $stdout << <<-UNREJECTABLE
113
+ CANNOT ACKNOWLEDGE OR REJECT THE MESSAGE
114
+
115
+ This is a exceptional state for ActionSubscriber to enter and puts the current
116
+ Process in the position of "I can't get new work from RabbitMQ, but also
117
+ can't acknowledge or reject the work that I currently have" ... While rare
118
+ this state can happen.
119
+
120
+ Instead of continuing to try to process the message ActionSubscriber is
121
+ sending a Kill signal to the current running process to gracefully shutdown
122
+ so that the RabbitMQ server will purge any outstanding acknowledgements. If
123
+ you are running a process monitoring tool (like Upstart) the Subscriber
124
+ process will be restarted and be able to take on new work.
125
+
126
+ ** Running a process monitoring tool like Upstart is recommended for this reason **
127
+ UNREJECTABLE
128
+
129
+ Process.kill(:TERM, Process.pid)
130
+ end
75
131
  end
76
132
 
77
133
  def reject
@@ -11,6 +11,10 @@ module ActionSubscriber
11
11
  bunny_consumers.each(&:cancel)
12
12
  end
13
13
 
14
+ def create_queue(channel, queue_name, queue_options)
15
+ ::Bunny::Queue.new(channel, queue_name, queue_options)
16
+ end
17
+
14
18
  def auto_pop!
15
19
  # Because threadpools can be large we want to cap the number
16
20
  # of times we will pop each time we poll the broker
@@ -7,6 +7,12 @@ module ActionSubscriber
7
7
  march_hare_consumers.each(&:cancel)
8
8
  end
9
9
 
10
+ def create_queue(channel, queue_name, queue_options)
11
+ queue = ::MarchHare::Queue.new(channel, queue_name, queue_options)
12
+ queue.declare!
13
+ queue
14
+ end
15
+
10
16
  def auto_pop!
11
17
  # Because threadpools can be large we want to cap the number
12
18
  # of times we will pop each time we poll the broker
@@ -43,11 +43,13 @@ module ActionSubscriber
43
43
  def acknowledge
44
44
  acknowledge_multiple_messages = false
45
45
  @channel.ack(@delivery_tag, acknowledge_multiple_messages)
46
+ true
46
47
  end
47
48
 
48
49
  def reject
49
50
  requeue_message = true
50
51
  @channel.reject(@delivery_tag, requeue_message)
52
+ true
51
53
  end
52
54
 
53
55
  def to_hash
@@ -26,8 +26,14 @@ module ActionSubscriber
26
26
 
27
27
  def setup_queue(route)
28
28
  channel = ::ActionSubscriber::RabbitConnection.subscriber_connection.create_channel
29
+ # Make channels threadsafe again! Believe Me!
30
+ # Accessing channels from multiple threads for messsage acknowledgement will crash
31
+ # a channel and stop messages from being received on that channel
32
+ # this isn't very clear in the documentation for march_hare/bunny, but it is
33
+ # explicitly addresses here: https://github.com/rabbitmq/rabbitmq-java-client/issues/53
34
+ channel = ::ActionSubscriber::Synchronizer.new(channel)
29
35
  exchange = channel.topic(route.exchange)
30
- queue = channel.queue(route.queue, :durable => route.durable)
36
+ queue = create_queue(channel, route.queue, :durable => route.durable)
31
37
  queue.bind(exchange, :routing_key => route.routing_key)
32
38
  queue
33
39
  end
@@ -0,0 +1,15 @@
1
+ require "thread"
2
+ module ActionSubscriber
3
+ class Synchronizer
4
+ def initialize(delegate)
5
+ @delegate = delegate
6
+ @mutex = ::Mutex.new
7
+ end
8
+
9
+ def method_missing(name, *args, &block)
10
+ @mutex.synchronize do
11
+ @delegate.public_send(name, *args, &block)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module ActionSubscriber
2
- VERSION = "2.4.0"
2
+ VERSION = "2.5.0.pre2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_subscriber
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 2.5.0.pre2
5
5
  platform: java
6
6
  authors:
7
7
  - Brian Stien
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2016-04-11 00:00:00.000000000 Z
15
+ date: 2016-09-12 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  requirement: !ruby/object:Gem::Requirement
@@ -223,6 +223,7 @@ files:
223
223
  - lib/action_subscriber/router.rb
224
224
  - lib/action_subscriber/rspec.rb
225
225
  - lib/action_subscriber/subscribable.rb
226
+ - lib/action_subscriber/synchronizer.rb
226
227
  - lib/action_subscriber/threadpool.rb
227
228
  - lib/action_subscriber/uri.rb
228
229
  - lib/action_subscriber/version.rb
@@ -271,12 +272,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
271
272
  version: '0'
272
273
  required_rubygems_version: !ruby/object:Gem::Requirement
273
274
  requirements:
274
- - - ">="
275
+ - - ">"
275
276
  - !ruby/object:Gem::Version
276
- version: '0'
277
+ version: 1.3.1
277
278
  requirements: []
278
279
  rubyforge_project:
279
- rubygems_version: 2.5.0
280
+ rubygems_version: 2.6.6
280
281
  signing_key:
281
282
  specification_version: 4
282
283
  summary: ActionSubscriber is a DSL that allows a rails app to consume messages from a RabbitMQ broker.