fastly_nsq 0.6.0 → 0.7.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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.github/PULL_REQUEST_TEMPLATE.md +6 -3
  3. data/.travis.yml +1 -1
  4. data/README.md +23 -73
  5. data/env_configuration_for_local_gem_tests.yml +0 -1
  6. data/examples/.sample.env +0 -2
  7. data/examples/Rakefile +20 -67
  8. data/lib/fastly_nsq/{message_queue/consumer.rb → consumer.rb} +8 -8
  9. data/lib/fastly_nsq/fake_backend.rb +100 -0
  10. data/lib/fastly_nsq/listener.rb +59 -0
  11. data/lib/fastly_nsq/message.rb +18 -0
  12. data/lib/fastly_nsq/{message_queue/producer.rb → producer.rb} +8 -8
  13. data/lib/fastly_nsq/rake_task.rb +39 -43
  14. data/lib/fastly_nsq/ssl_context.rb +35 -33
  15. data/lib/fastly_nsq/strategy.rb +38 -0
  16. data/lib/fastly_nsq/version.rb +1 -1
  17. data/lib/fastly_nsq.rb +21 -1
  18. data/spec/lib/fastly_nsq/consumer_spec.rb +68 -0
  19. data/spec/lib/fastly_nsq/{fake_message_queue_spec.rb → fake_backend_spec.rb} +23 -23
  20. data/spec/lib/fastly_nsq/listener_spec.rb +116 -0
  21. data/spec/lib/fastly_nsq/message_spec.rb +24 -0
  22. data/spec/lib/fastly_nsq/producer_spec.rb +56 -0
  23. data/spec/lib/fastly_nsq/rake_task_spec.rb +87 -74
  24. data/spec/lib/fastly_nsq/ssl_context_spec.rb +6 -6
  25. data/spec/lib/fastly_nsq/{message_queue/strategy_spec.rb → strategy_spec.rb} +6 -5
  26. data/spec/lib/fastly_nsq_spec.rb +18 -0
  27. data/spec/spec_helper.rb +1 -6
  28. metadata +15 -16
  29. data/lib/fastly_nsq/fake_message_queue.rb +0 -98
  30. data/lib/fastly_nsq/message_queue/listener.rb +0 -49
  31. data/lib/fastly_nsq/message_queue/strategy.rb +0 -34
  32. data/lib/fastly_nsq/message_queue.rb +0 -21
  33. data/lib/fastly_nsq/sample_message_processor.rb +0 -50
  34. data/spec/lib/fastly_nsq/message_queue/consumer_spec.rb +0 -60
  35. data/spec/lib/fastly_nsq/message_queue/listener_spec.rb +0 -90
  36. data/spec/lib/fastly_nsq/message_queue/producer_spec.rb +0 -49
  37. data/spec/lib/fastly_nsq/message_queue_spec.rb +0 -32
  38. data/spec/lib/fastly_nsq/sample_message_processor_spec.rb +0 -38
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 912a3507f9a1f2aa279cae728bbfef969339efa4
4
- data.tar.gz: 58b52a9f841f21cd58385b87e81e9a73a7397648
3
+ metadata.gz: 2118f8fbefbf2cdd4986db89e65f2fab4c215ac8
4
+ data.tar.gz: dc20875b82f3b58a4e8eda09148f50f5d1d4e409
5
5
  SHA512:
6
- metadata.gz: c4b5b7230487629c39cfc004f5f0cdac24c2912bbefc8f4938a38ca1d975fccf320f7347c210b769fb8b00bfe4d28461dabc9824fce2dc8fd2ea11063a3a6a7b
7
- data.tar.gz: dedc25afac6237e9efc24ce889e57d5fa3b27fc658bd36d92cccb3207064fd6582d21def6580707cb0dfd0682f9b5c1b2d05b79b43130965f28605e1cee1bb85
6
+ metadata.gz: d7f6bf648089f9686bed42a7c2e0c16d9bb177843c9b396847139b50ed6e36b0016f7365371c1d51b5503e8ee1080ddcb2ce402a9c8481bc8459948bec09acb8
7
+ data.tar.gz: e65fd5fbf597af38de0163e30901dfcf8493e3213ae3727067a6bb2660974e8bc191a43898026f5b31d2ecb9f04f9a04450dc11270b1f0bf39b138b7c2b267fe
@@ -1,6 +1,8 @@
1
+ __NOTE: Do NOT add any Jira links to this PR description or commits. This is a public repository.__
2
+
1
3
  Reason for Change
2
4
  ===================
3
- Describe the big picture of your changes here to communicate why this pull
5
+ * Describe the big picture of your changes here to communicate why this pull
4
6
  request should be accepted. If it fixes a bug or resolves a feature request,
5
7
  be sure to link to that issue.
6
8
 
@@ -11,7 +13,7 @@ List of Changes
11
13
 
12
14
  Risks
13
15
  =====
14
- Describe any risks you see to existing systems this fix or feature might have
16
+ * Describe any risks you see to existing systems this fix or feature might have
15
17
  if those systems where to incorporate this change.
16
18
 
17
19
  Checklist
@@ -19,6 +21,7 @@ Checklist
19
21
  _Put an `x` in the boxes that apply.
20
22
  You can also fill these out after creating the PR._
21
23
 
24
+ - [ ] I have NOT linked to any Jira tickets.
22
25
  - [ ] I have linked to all relevant reference issues or work requests
23
26
  - [ ] I have added tests that prove my fix is effective or that my feature works
24
27
  - [ ] I have added or updated necessary documentation (if appropriate)
@@ -27,4 +30,4 @@ You can also fill these out after creating the PR._
27
30
 
28
31
  Recommended Reviewers
29
32
  =====================
30
- @alieander, ...
33
+ @fastly/billing
data/.travis.yml CHANGED
@@ -9,7 +9,7 @@ script:
9
9
  notifications:
10
10
  slack:
11
11
  rooms:
12
- - 'fastly:hFvhBQKliYl9QAO3VujcrLhe#billy'
12
+ secure: Uo78FoH8dwSbt7BjTcfb62RXW8aU5h2se+bs0fHSXNrzh6D3Zl+JmwzMkgN8u7M6F0WsOy6RhilYggRYAGds4K1CUi0wGJOG86NaXB4igqBIdHa6f6vzMQZoXxJk8ekc/0NFCj2UV+2Obt6FpeUZvF0Y+u029k5gN0SROfrN+ANtSq+jbI8sdsCCsedXHgDWnGsZS1hHleiRF1Q6VfKnBFcewPP/W49gzbABlKk2MjkVhse6kg+7+LRXfnDxh+aaRXBGYfzmGn4+gS6Jey63U0woAa8TdP/THlwhgvvBS0kwMMaCss+Uq1690lnVV5MX84Fsm4C+A9gbdJmlansLrYRRWm4aaAf8IGlqRTwx3F2yNHTaPA2zmkooFtn1kTuz1J8L9NjsVPPkATMAg3rTIhel+YkVK8q0Q9N9A70+P2u+Rp3htgjxVPMN7Ve9GqejUEaw690Wsp4hCK5tINj8Aq42ET/RpQt4Rzx78Vk4jEK+9UsFuuRH+awAJu/UsnA0JMTq9Smgk2kE69McVNfYPXRIRQXWAkV2dc6FwI8AAmqRusTeyWMK9SOQNXhlmry5ltWfAnHtuKdq9delbc1iOkcj8u9sCBkTz0ZogsI2oHpLlrw2oHFe49kSOkB5HMSQo8IOR7yXHAZ41lmd87/T367bak9HGqsCrweJL7Vz2Mw=
13
13
  on_success: change
14
14
  on_failure: change
15
15
  email:
data/README.md CHANGED
@@ -37,12 +37,7 @@ and `bundle install`.
37
37
 
38
38
  ## Usage
39
39
 
40
- *IMPORTANT NOTE:* You must create your own `MessageProcessor` class
41
- for this gem to work in your application.
42
-
43
- See more information below.
44
-
45
- ### `MessageQueue::Producer`
40
+ ### `FastlyNsq::Producer`
46
41
 
47
42
  This is a class
48
43
  which provides an adapter to the
@@ -57,7 +52,7 @@ message_data = {
57
52
  }
58
53
  }
59
54
 
60
- producer = MessageQueue::Producer.new(
55
+ producer = FastlyNsq::Producer.new(
61
56
  nsqd: ENV.fetch('NSQD_TCP_ADDRESS'),
62
57
  topic: topic,
63
58
  )
@@ -77,7 +72,7 @@ ENV['FAKE_QUEUE'] = true
77
72
  ENV['FAKE_QUEUE'] = false
78
73
  ```
79
74
 
80
- ### `MessageQueue::Consumer`
75
+ ### `FastlyNsq::Consumer`
81
76
  This is a class
82
77
  which provides an adapter to the
83
78
  fake and real NSQ consumers.
@@ -85,7 +80,7 @@ These are used to
85
80
  read messages off of the queue:
86
81
 
87
82
  ```ruby
88
- consumer = MessageQueue::Consumer.new(
83
+ consumer = FastlyNsq::Consumer.new(
89
84
  topic: 'topic',
90
85
  channel: 'channel'
91
86
  )
@@ -103,48 +98,44 @@ the mock/real strategy used
103
98
  can be switched by setting the
104
99
  `FAKE_QUEUE` environment variable appropriately.
105
100
 
106
- ### `MessageQueue::Listener`
101
+ ### `FastlyNsq::Listener`
107
102
 
108
103
  To process the next message on the queue:
109
104
 
110
105
  ```ruby
111
- topic = 'user_created'
112
- channel = 'my_consuming_service'
106
+ topic = 'user_created'
107
+ channel = 'my_consuming_service'
108
+ processor = MessageProcessor
113
109
 
114
- MessageQueue::Listener.new(topic: topic, channel: channel).process_next_message
110
+ FastlyNsq::Listener.new(topic: topic, channel: channel, processor: processor).go(run_once: true)
115
111
  ```
116
112
 
117
113
  This will pop the next message
118
114
  off of the queue
119
115
  and send the JSON text body
120
- to `MessageProcessor.new(message_body: message_body, topic: topic).go`.
116
+ to `MessageProcessor.process(message_body, topic)`.
121
117
 
122
118
  To initiate a blocking loop to process messages continuously:
123
119
 
124
120
  ```ruby
125
- topic = 'user_created'
126
- channel = 'my_consuming_service'
121
+ topic = 'user_created'
122
+ channel = 'my_consuming_service'
123
+ processor = MessageProcessor
127
124
 
128
- MessageQueue::Listener.new(topic: topic, channel: channel).go
125
+ FastlyNsq::Listener.new(topic: topic, channel: channel, processor: processor).go
129
126
  ```
130
127
 
131
128
  This will block until
132
129
  there is a new message on the queue,
133
130
  pop the next message
134
131
  off of the queue
135
- and send it to `MessageProcessor.new(message_body).go`.
132
+ and send it to `MessageProcessor.process(message_body, topic)`.
136
133
 
137
- ### `MessageQueue::RakeTask`
134
+ ### `FastlyNsq::RakeTask`
138
135
 
139
- To help facilitate running the `MessageQueue::Listener` in a blocking fashion
136
+ To help facilitate running the `FastlyNsq::Listener` in a blocking fashion
140
137
  outside your application, a simple `RakeTask` is provided.
141
138
 
142
- NOTE: The rake task expects a
143
- `MessageProcessor.topics` method,
144
- which must return an array of strings
145
- defining the topics to which
146
- we would like to listen and process messages.
147
-
148
139
  The task will listen
149
140
  to all specified topics,
150
141
  each in a separate thread.
@@ -155,26 +146,14 @@ Using a block:
155
146
  ```ruby
156
147
  require 'fastly_nsq/rake_task'
157
148
 
158
- MessageQueue::RakeTask.new(:listen_task) do |task|
149
+ FastlyNsq::RakeTask.new(:listen_task) do |task|
159
150
  task.channel = 'some_channel'
151
+ task.topics = {
152
+ 'some_topic' => SomeMessageProcessor
153
+ }
160
154
  end
161
155
 
162
- # usage:
163
- `rake listen_task`
164
- ```
165
-
166
- or using passed in values:
167
- ```ruby
168
- require 'fastly_nsq/rake_task'
169
-
170
- MessageQueue::RakeTask.new(:listen_task, [:channel])
171
-
172
- # usage:
173
- `rake listen_task['my_channel']`
174
- ```
175
-
176
- Both methods can be used at the same time with the passed in values taking
177
- priority over block assigned values
156
+ The task can also define a `call`-able "preprocessor" (called before any `Processor.process`) and a custom `logger`.
178
157
 
179
158
  See the [`Rakefile`](examples/Rakefile) file
180
159
  for more detail.
@@ -195,34 +174,6 @@ as the real adapter.
195
174
 
196
175
  ## Configuration
197
176
 
198
- ### Processing Messages
199
-
200
- This gem expects you to create a
201
- new class called `MessageProcessor`
202
- which will process messages
203
- once they are consumed off of the queue topic.
204
-
205
- This class needs to adhere to the following API:
206
-
207
- ```ruby
208
- class MessageProcessor
209
- # This an instance of NSQ::Message or FakeMessageQueue::Message
210
- def initialize(message_body)
211
- @message_body = message_body
212
- end
213
-
214
- def start
215
- # Do things
216
- end
217
-
218
- private
219
-
220
- def message
221
- JSON.parse(@message_body)
222
- end
223
- end
224
- ```
225
-
226
177
  ### Environment Variables
227
178
 
228
179
  The URLs for the various
@@ -235,7 +186,6 @@ stock NSQ on OS X,
235
186
  installed via Homebrew:
236
187
 
237
188
  ```shell
238
- BROADCAST_ADDRESS='127.0.0.1'
239
189
  NSQD_TCP_ADDRESS='127.0.0.1:4150'
240
190
  NSQD_HTTP_ADDRESS='127.0.0.1:4151'
241
191
  NSQLOOKUPD_TCP_ADDRESS='127.0.0.1:4160'
@@ -263,7 +213,7 @@ FAKE_QUEUE=true
263
213
  ```
264
214
 
265
215
  Also be sure call
266
- `FakeMessageQueue.reset!`
216
+ `FakeBackend.reset!`
267
217
  before each test in your app to ensure
268
218
  there are no leftover messages.
269
219
 
@@ -1,4 +1,3 @@
1
- BROADCAST_ADDRESS: '127.0.0.1'
2
1
  NSQD_TCP_ADDRESS: '127.0.0.1:4150'
3
2
  NSQD_HTTP_ADDRESS: '127.0.0.1:4151'
4
3
  NSQLOOKUPD_TCP_ADDRESS: '127.0.0.1:4160'
data/examples/.sample.env CHANGED
@@ -1,13 +1,11 @@
1
1
  # NSQ
2
2
  # In the Fastly Dev VM
3
- BROADCAST_ADDRESS='billing'
4
3
  NSQD_TCP_ADDRESS='billing:1910'
5
4
  NSQD_HTTP_ADDRESS='billing:1911'
6
5
  NSQLOOKUPD_TCP_ADDRESS='billing:4160'
7
6
  NSQLOOKUPD_HTTP_ADDRESS='billing:4161'
8
7
 
9
8
  # On OSX with Homebrew defaults (brew install nsq)
10
- BROADCAST_ADDRESS='127.0.0.1'
11
9
  NSQD_TCP_ADDRESS='127.0.0.1:4150'
12
10
  NSQD_HTTP_ADDRESS='127.0.0.1:4151'
13
11
  NSQLOOKUPD_TCP_ADDRESS='127.0.0.1:4160'
data/examples/Rakefile CHANGED
@@ -1,88 +1,41 @@
1
1
  require 'fastly_nsq/rake_task'
2
2
 
3
- #-------------------------------------------------------------------------------
4
- # You are required to to set the topics in MessageProcessor.topics as an array:
5
-
6
- class MessageProcessor
7
- def self.topics
8
- %w(customer_created customer_deleted)
9
- end
10
-
11
- # ...
12
- end
13
-
14
- # A channel will need to be passed in
15
- # to the Rake task
3
+ # A list of topics and a channel will need to be passed in to the Rake task
16
4
  # when it is called.
17
- #
18
- # The task looks like:
19
-
20
- desc 'Listen to the messaging queue with the given channel.'
21
-
22
- MessageQueue::RakeTask.new(:listen_task, [:channel])
23
-
24
- # Call `rake listen_task[my_channel]`.
25
- # The topics will be ['customer_created', 'customer_deleted']
26
- # and channel will be 'my_channel'.
27
-
28
- #-------------------------------------------------------------------------------
29
- # In Rails, you can include the application environment. The task looks like:
30
-
31
- desc 'Listen to the messaging queue with the given channel.'
32
-
33
- MessageQueue::RakeTask.new(:listen_task, [:channel] => :environment)
34
-
35
- # Call `rake listen_task[your_channel]`.
36
- # The topics will be ['customer_created', 'customer_deleted']
37
- # and channel will be 'your_channel'.
38
-
39
- #-------------------------------------------------------------------------------
40
- # The channel can also be preset in the task
41
- # by passing a block and assigning the value. The task looks like:
42
5
 
43
6
  desc 'Listen to the messaging queue with the given channel.'
44
7
 
45
- MessageQueue::RakeTask.new(:listen_task) do |task|
8
+ FastlyNsq::RakeTask.new(:listen_task) do |task|
46
9
  task.channel = 'some_channel'
10
+ task.topics = { 'a_topic' => RespondsToProcess }
47
11
  end
48
12
 
49
- # Call `rake listen_task`.
50
- # The topics will be ['customer_created', 'customer_deleted']
51
- # and channel will be 'some_channel'.
52
-
53
- #-------------------------------------------------------------------------------
54
- # Do the same thing and include the environment:
13
+ # A custom logger and preprocessor
55
14
 
56
15
  desc 'Listen to the messaging queue with the given channel.'
57
16
 
58
- MessageQueue::RakeTask.new(:listen_task, [] => :environment) do |task|
59
- task.channel = 'her_channel'
17
+ FastlyNsq::RakeTask.new(:listen_task) do |task|
18
+ task.channel = 'some_channel'
19
+ task.topics = { 'a_topic' => RespondsToProcess }
20
+ task.preprocessor = ->(message) { StatsClient.log(message) }
21
+ task.logger = Logger.new(STDERR)
60
22
  end
61
23
 
62
- # Call `rake listen_task`.
63
- # The topics will be ['customer_created', 'customer_deleted']
64
- # and channel will be 'her_channel'.
24
+ #-------------------------------------------------------------------------------
25
+ # In Rails, you can include the application environment. The task looks like:
26
+
27
+ FastlyNsq::RakeTask.new(:listen_task => :environment)
65
28
 
66
29
  #-------------------------------------------------------------------------------
67
- # Both forms can be combined
68
- # to provide defaults
69
- # with the ability to override at time of Rake call:
30
+ # It's also possible to define the rake task to allow for overriding channel
31
+ # and topics when calling the rake task:
70
32
 
71
- MessageQueue::RakeTask.new(:listen_task, [:channel]) do |task|
72
- task.channel = 'default_channel'
73
- end
33
+ FastlyNsq::RakeTask.new(:listen_task, [:channel, :topics])
74
34
 
75
- # Call `rake listen_task[overridden_channel]`.
76
- # The topics will be ['customer_created', 'customer_deleted']
77
- # and channel will be 'overridden_channel'.
35
+ # Then call the task:
36
+ # rake listen_task[my_channel, {topic: Processor}]
78
37
 
79
38
  #-------------------------------------------------------------------------------
80
- # The same, but including the environment:
81
-
82
- MessageQueue::RakeTask.new(:listen_task, [:channel] => :environment) do |task|
83
- task.channel = 'default_channel'
84
- end
39
+ # Do the same thing and include the environment:
85
40
 
86
- # Call `rake listen_task[overridden_channel]`.
87
- # The topics will be ['customer_created', 'customer_deleted']
88
- # and channel will be 'overridden_channel'.
41
+ FastlyNsq::RakeTask.new(:listen_task, [:channel, :topics] => :environment)
@@ -1,8 +1,6 @@
1
1
  require 'forwardable'
2
2
 
3
- class InvalidParameterError < StandardError; end
4
-
5
- module MessageQueue
3
+ module FastlyNsq
6
4
  class Consumer
7
5
  extend Forwardable
8
6
  def_delegator :connection, :pop
@@ -14,17 +12,19 @@ module MessageQueue
14
12
  @topic = topic
15
13
  @channel = channel
16
14
  @ssl_context = SSLContext.new(ssl_context)
17
- @connector = connector || DEFAULT_CONNECTOR
15
+ @connector = connector
18
16
  end
19
17
 
20
18
  private
21
19
 
22
- attr_reader :channel, :connector, :topic, :ssl_context
23
-
24
- DEFAULT_CONNECTOR = ->(params) { MessageQueue.strategy::Consumer.new(params) }
20
+ attr_reader :channel, :topic, :ssl_context
25
21
 
26
22
  def connection
27
- @connection ||= connector.call(params)
23
+ @connection ||= connector.new(params)
24
+ end
25
+
26
+ def connector
27
+ @connector || FastlyNsq.strategy::Consumer
28
28
  end
29
29
 
30
30
  def params
@@ -0,0 +1,100 @@
1
+ module FastlyNsq
2
+ module FakeBackend
3
+ @@logger = Logger.new(nil)
4
+ @@delay = 0.5
5
+ @@queue = []
6
+
7
+ def self.queue
8
+ @@queue
9
+ end
10
+
11
+ def self.queue=(message)
12
+ @@queue = message
13
+ end
14
+
15
+ def self.reset!
16
+ self.queue = []
17
+ end
18
+
19
+ def self.logger=(logger)
20
+ @@logger = logger
21
+ end
22
+
23
+ def self.logger
24
+ @@logger
25
+ end
26
+
27
+ def self.delay
28
+ @@delay
29
+ end
30
+
31
+ def self.delay=(delay)
32
+ @@delay = delay
33
+ end
34
+
35
+ class Producer
36
+ def initialize(topic:, nsqd: nil, ssl_context: nil)
37
+ end
38
+
39
+ def write(string)
40
+ message = Message.new(string)
41
+ queue.push(message)
42
+ end
43
+
44
+ def terminate
45
+ # noop
46
+ end
47
+
48
+ private
49
+
50
+ def queue
51
+ FakeBackend.queue
52
+ end
53
+ end
54
+
55
+ class Consumer
56
+ def initialize(nsqlookupd: nil, topic:, channel:, ssl_context: nil)
57
+ end
58
+
59
+ def pop(delay = FakeBackend.delay)
60
+ message = nil
61
+
62
+ until message
63
+ message = queue.pop
64
+ sleep delay
65
+ end
66
+
67
+ message
68
+ end
69
+
70
+ def pop_without_blocking
71
+ queue.pop
72
+ end
73
+
74
+ def size
75
+ queue.size
76
+ end
77
+
78
+ def terminate
79
+ # noop
80
+ end
81
+
82
+ private
83
+
84
+ def queue
85
+ FakeBackend.queue
86
+ end
87
+ end
88
+
89
+ class Message
90
+ attr_reader :body
91
+
92
+ def initialize(body)
93
+ @body = body
94
+ end
95
+
96
+ def finish
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,59 @@
1
+ require 'fastly_nsq/message'
2
+
3
+ module FastlyNsq
4
+ class Listener
5
+ def self.listen_to(**args)
6
+ new(**args).go
7
+ end
8
+
9
+ def initialize(topic:, processor:, channel: nil, consumer: nil, **options)
10
+ @topic = topic
11
+ @processor = processor
12
+ @consumer = consumer || FastlyNsq::Consumer.new(topic: topic, channel: channel)
13
+ @logger = options.fetch :logger, FastlyNsq.logger
14
+ @preprocessor = options[:preprocessor]
15
+ end
16
+
17
+ def go(run_once: false)
18
+ exit_on 'INT'
19
+ exit_on 'TERM'
20
+
21
+ loop do
22
+ next_message do |message|
23
+ log message
24
+ preprocess message
25
+ processor.process message
26
+ end
27
+
28
+ break if run_once
29
+ end
30
+
31
+ consumer.terminate
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :topic, :consumer, :preprocessor, :processor, :logger
37
+
38
+ def log(message)
39
+ logger.info "[NSQ] Message Received: #{message}" if logger
40
+ end
41
+
42
+ def next_message
43
+ message = consumer.pop # TODO: consumer.pop do |message|
44
+ result = yield FastlyNsq::Message.new(message.body)
45
+ message.finish if result
46
+ end
47
+
48
+ def preprocess(message)
49
+ preprocessor.call(message) if preprocessor
50
+ end
51
+
52
+ def exit_on(signal)
53
+ Signal.trap(signal) do
54
+ consumer.terminate
55
+ exit
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,18 @@
1
+ require 'json'
2
+
3
+ class FastlyNsq::Message
4
+ attr_reader :raw_body
5
+ alias to_s raw_body
6
+
7
+ def initialize(raw_body)
8
+ @raw_body = raw_body
9
+ end
10
+
11
+ def data
12
+ @data ||= body['data']
13
+ end
14
+
15
+ def body
16
+ @body ||= JSON.parse(raw_body)
17
+ end
18
+ end
@@ -1,8 +1,6 @@
1
1
  require 'forwardable'
2
2
 
3
- class InvalidParameterError < StandardError; end
4
-
5
- module MessageQueue
3
+ module FastlyNsq
6
4
  class Producer
7
5
  extend Forwardable
8
6
  def_delegator :connection, :terminate
@@ -11,17 +9,19 @@ module MessageQueue
11
9
  def initialize(topic:, ssl_context: nil, connector: nil)
12
10
  @topic = topic
13
11
  @ssl_context = SSLContext.new(ssl_context)
14
- @connector = connector || DEFAULT_CONNECTOR
12
+ @connector = connector
15
13
  end
16
14
 
17
15
  private
18
16
 
19
- DEFAULT_CONNECTOR = ->(params) { MessageQueue.strategy::Producer.new params }
20
-
21
- attr_reader :connector, :topic, :ssl_context
17
+ attr_reader :topic, :ssl_context
22
18
 
23
19
  def connection
24
- @connection ||= connector.call(params)
20
+ @connection ||= connector.new(params)
21
+ end
22
+
23
+ def connector
24
+ @connector || FastlyNsq.strategy::Producer
25
25
  end
26
26
 
27
27
  def params