dispatch-rider 0.0.5 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -37,21 +37,21 @@ All configuration can be loaded from a hash instead of being done like the examp
37
37
  eg:
38
38
 
39
39
  ```ruby
40
- publisher = DispatchRider::Publisher.new
41
- publisher.configure({
42
- notification_services: {
43
- file_system: {}
44
- },
45
- destinations: {
46
- file_foo: {
47
- service: :file_system,
48
- channel: :foo,
49
- options: {
50
- path: "test/channel",
51
- }
40
+ publisher = DispatchRider::Publisher.new
41
+ publisher.configure({
42
+ notification_services: {
43
+ file_system: {}
44
+ },
45
+ destinations: {
46
+ file_foo: {
47
+ service: :file_system,
48
+ channel: :foo,
49
+ options: {
50
+ path: "test/channel",
52
51
  }
53
52
  }
54
- })
53
+ }
54
+ })
55
55
  ```
56
56
 
57
57
  You can load this configuration hash from a YAML file or something, whatever works
@@ -62,113 +62,106 @@ well for your environment.
62
62
  To publish using the filesystem register the path where to publish the message files.
63
63
 
64
64
  ```ruby
65
-
66
- publisher = DispatchRider::Publisher.new
67
-
68
- publisher.register_notification_service(:file_system)
69
- publisher.register_destination(:local_message_queue, :file_system, :dev_channel, :path => "tmp/news-updates")
70
-
71
- publisher.publish(:destinations => :local_message_queue, :message => {
72
- :subject => "read_news",
73
- :body => {"headlines" => [
74
- "April 29, 2013: Rails 4.0.0.rc1 is released.",
75
- "May 14, 2013: Ruby 2.0.0-p195 is released"
76
- ]
77
- }})
78
-
65
+ publisher = DispatchRider::Publisher.new
66
+
67
+ publisher.register_notification_service(:file_system)
68
+ publisher.register_destination(:local_message_queue, :file_system, :dev_channel, :path => "tmp/news-updates")
69
+
70
+ publisher.publish(:destinations => :local_message_queue, :message => {
71
+ :subject => "read_news",
72
+ :body => {"headlines" => [
73
+ "April 29, 2013: Rails 4.0.0.rc1 is released.",
74
+ "May 14, 2013: Ruby 2.0.0-p195 is released"
75
+ ]
76
+ }})
79
77
  ```
80
78
 
81
79
  To publish using ```AWS::SNS``` make sure ```AWS.config``` has been setup.
82
80
  It's then as easy as providing the configuration details of the topic to the publisher.
83
81
 
84
82
  ```ruby
85
-
86
- publisher = DispatchRider::Publisher.new
87
-
88
- publisher.register_notification_service(:aws_sns)
89
- publisher.register_destination(:sns_message_queue, :aws_sns, :dev_channel, {
90
- :account => 777,
91
- :region => 'us-east-1',
92
- :topic => 'RoR'
93
- })
94
-
95
- publisher.publish(:destinations => :sns_message_queue, :message => {
96
- :subject => "read_news",
97
- :body => {"headlines" => [
98
- "April 29, 2013: Rails 4.0.0.rc1 is released.",
99
- "May 14, 2013: Ruby 2.0.0-p195 is released"
100
- ]
101
- }})
102
-
83
+ publisher = DispatchRider::Publisher.new
84
+
85
+ publisher.register_notification_service(:aws_sns)
86
+ publisher.register_destination(:sns_message_queue, :aws_sns, :dev_channel, {
87
+ :account => 777,
88
+ :region => 'us-east-1',
89
+ :topic => 'RoR'
90
+ })
91
+
92
+ publisher.publish(:destinations => :sns_message_queue, :message => {
93
+ :subject => "read_news",
94
+ :body => {"headlines" => [
95
+ "April 29, 2013: Rails 4.0.0.rc1 is released.",
96
+ "May 14, 2013: Ruby 2.0.0-p195 is released"
97
+ ]
98
+ }})
103
99
  ```
104
100
 
105
101
  To publish to multiple destinations:
106
102
 
107
103
  ```ruby
108
-
109
- publisher.publish(:destinations => [:local_message_queue, :sns_message_queue], :message => {
110
- :subject => "read_news",
111
- :body => {"headlines" => [
112
- "April 29, 2013: Rails 4.0.0.rc1 is released.",
113
- "May 14, 2013: Ruby 2.0.0-p195 is released"
114
- ]
115
- }})
116
-
104
+ publisher.publish(:destinations => [:local_message_queue, :sns_message_queue], :message => {
105
+ :subject => "read_news",
106
+ :body => {"headlines" => [
107
+ "April 29, 2013: Rails 4.0.0.rc1 is released.",
108
+ "May 14, 2013: Ruby 2.0.0-p195 is released"
109
+ ]
110
+ }})
117
111
  ```
118
112
 
119
113
  Sample Rails publisher:
120
114
 
121
115
  ```ruby
116
+ # app/publishers/news_update
117
+ class NewsPublisher
118
+ @publisher = DispatchRider::Publisher.new
122
119
 
123
- # app/publishers/news_update
124
- class NewsPublisher
125
- @publisher = DispatchRider::Publisher.new
120
+ amazon_config = YAML.load_file("#{Rails.root}/config/amazon.yml")
126
121
 
127
- amazon_config = YAML.load_file("#{Rails.root}/config/amazon.yml")
122
+ @publisher.register_notification_service(:aws_sns)
123
+ @publisher.register_destination(:sns_message_queue, :aws_sns, :dev_channel, {
124
+ :account => amazon_config[:account],
125
+ :region => amazon_config[:region],
126
+ :topic => "news-updates-#{Rails.env}"
127
+ })
128
128
 
129
- @publisher.register_notification_service(:aws_sns)
130
- @publisher.register_destination(:sns_message_queue, :aws_sns, :dev_channel, {
131
- :account => amazon_config[:account],
132
- :region => amazon_config[:region],
133
- :topic => "news-updates-#{Rails.env}"
134
- })
129
+ @destinations = [:sns_message_queue]
135
130
 
136
- @destinations = [:sns_message_queue]
131
+ class << self
132
+ attr_reader :publisher
133
+ attr_accessor :destinations
134
+ end
137
135
 
138
- class << self
139
- attr_reader :publisher
140
- attr_accessor :destinations
141
- end
136
+ delegate :publisher, :destinations, :to => :"self.class"
142
137
 
143
- delegate :publisher, :destinations, :to => :"self.class"
138
+ def initialize(news)
139
+ @news = news
140
+ end
144
141
 
145
- def initialize(news)
146
- @news = news
147
- end
148
-
149
- def publish
150
- publisher.publish(:destinations => destinations, :message => {
151
- :subject => "read_news",
152
- :body => {"headlines" => @news.headlines}
153
- })
154
- end
155
- end
142
+ def publish
143
+ publisher.publish(:destinations => destinations, :message => {
144
+ :subject => "read_news",
145
+ :body => {"headlines" => @news.headlines}
146
+ })
147
+ end
148
+ end
156
149
 
157
- # app/models/news
158
- class News
159
- serialize :headlines, Array
150
+ # app/models/news
151
+ class News
152
+ serialize :headlines, Array
160
153
 
161
- after_create :publish
154
+ after_create :publish
162
155
 
163
- def publish
164
- NewsPublisher.new(self).publish
165
- end
166
- end
156
+ def publish
157
+ NewsPublisher.new(self).publish
158
+ end
159
+ end
167
160
 
168
- News.create!(:headlines => [
169
- "April 29, 2013: Rails 4.0.0.rc1 is released.",
170
- "May 14, 2013: Ruby 2.0.0-p195 is released"
171
- ])
161
+ News.create!(:headlines => [
162
+ "April 29, 2013: Rails 4.0.0.rc1 is released.",
163
+ "May 14, 2013: Ruby 2.0.0-p195 is released"
164
+ ])
172
165
  ```
173
166
 
174
167
  ### Subscriber
@@ -177,118 +170,52 @@ To setup a subscriber you'll need message handlers. The handlers are named the s
177
170
 
178
171
  Sample message handler:
179
172
  ```ruby
180
-
181
- # app/handlers/bar_handler
182
- module ReadNews
183
- class << self
184
- def process(message_body)
185
- message_body["headlines"].each do |headline|
186
- puts headline
187
- end
188
- end
173
+ # app/handlers/bar_handler
174
+ module ReadNews
175
+ class << self
176
+ def process(message_body)
177
+ message_body["headlines"].each do |headline|
178
+ puts headline
189
179
  end
190
180
  end
191
-
181
+ end
182
+ end
192
183
  ```
193
184
 
194
185
  Sample subscriber setup:
195
186
 
196
187
  ```ruby
188
+ subscriber = DispatchRider::Subscriber.new
197
189
 
198
- subscriber = DispatchRider::Subscriber.new
199
-
200
- subscriber.register_queue(:aws_sqs, :name => "news-updates")
201
- subscriber.register_handler(:read_news)
202
- subscriber.setup_demultiplexer(:aws_sqs)
203
-
204
- subscriber.process
190
+ subscriber.register_queue(:aws_sqs, :name => "news-updates")
191
+ subscriber.register_handler(:read_news)
192
+ subscriber.setup_demultiplexer(:aws_sqs)
205
193
 
194
+ subscriber.process
206
195
  ```
207
196
 
208
197
  Sample subscriber dispatch error handling (optional):
209
198
 
210
199
  ```ruby
200
+ # using blocks
211
201
 
212
- # using blocks
202
+ subscriber.on_dispatch_error do |message, exception|
203
+ # put your error handling code here
213
204
 
214
- subscriber.on_dispatch_error do |message, exception|
215
- # put your error handling code here
205
+ return false # or return true to permanently remove the message
206
+ end
216
207
 
217
- return false # or return true to permanently remove the message
218
- end
219
-
220
- # using methods
221
-
222
- def handle_dispatch_error(message, exception)
223
- # put your error handling code here
208
+ # using methods
224
209
 
225
- return false # or return true to permanently remove the message
226
- end
210
+ def handle_dispatch_error(message, exception)
211
+ # put your error handling code here
227
212
 
228
- subscriber.on_dispatch_error &method(:handle_dispatch_error)
213
+ return false # or return true to permanently remove the message
214
+ end
229
215
 
216
+ subscriber.on_dispatch_error &method(:handle_dispatch_error)
230
217
  ```
231
218
 
232
-
233
- Sample Rails application rake task:
234
-
235
- ```ruby
236
-
237
- # lib/tasks/dispatch-rider
238
- namespace :"dispatch-rider" do
239
- desc "Tells DispatchRider to start running"
240
- task :run => [:"run:remote"]
241
-
242
- namespace :run do
243
- desc "Tells DispatchRider to start running"
244
- task :remote => [:ready, :set_aws_sqs_queue, :process]
245
-
246
- desc "Tells DispatchRider to start running (using the filesystem as the queue)"
247
- task :local => [:ready, :set_local_queue, :process]
248
-
249
- task :ready => :environment do
250
- puts "Creating subscriber..."
251
- @subscriber = DispatchRider::Subscriber.new
252
-
253
- [ # list of message handlers
254
- :read_news
255
- ].each do |handler_name|
256
- puts "Registering #{handler_name} handler..."
257
- @subscriber.register_handler(handler_name)
258
- end
259
- end
260
-
261
- task :set_aws_sqs_queue do
262
- queue_name = "news-updates-#{Rails.env}"
263
- puts "Setting AWS::SQS #{queue_name} queue..."
264
- @subscriber.register_queue(:aws_sqs, :name => queue_name)
265
- @subscriber.setup_demultiplexer(:aws_sqs)
266
- end
267
-
268
- task :set_local_queue do
269
- queue_path = "tmp/news-updates-#{Rails.env}"
270
- puts "Setting local filesystem queue @ #{queue_path.inspect}..."
271
- @subscriber.register_queue(:file_system, :path => queue_path)
272
- @subscriber.setup_demultiplexer(:file_system)
273
- end
274
-
275
- task :process do
276
- puts "Running..."
277
- @subscriber.process
278
- end
279
- end
280
- end
281
-
282
- ```
283
-
284
- To run the subscriber simply execute following:
285
-
286
- $ bundle exec rake dispatch-rider:run
287
-
288
- To run locally:
289
-
290
- $ bundle exec rake dispatch-rider:run:local
291
-
292
219
  ## Contributing
293
220
 
294
221
  ### Process
@@ -2,10 +2,14 @@
2
2
  # The handlers must be registered with the dispatcher.
3
3
  # Tha handlers need to be modules that implement the process method.
4
4
  # What handler to dispatch the message to is figured out from the subject of the message.
5
+
5
6
  module DispatchRider
6
7
  class Dispatcher
7
8
  extend Forwardable
8
9
 
10
+ require 'dispatch-rider/dispatcher/named_process'
11
+ include NamedProcess
12
+
9
13
  attr_reader :handler_registrar
10
14
 
11
15
  def_delegators :handler_registrar, :register, :fetch, :unregister
@@ -20,10 +24,14 @@ module DispatchRider
20
24
  end
21
25
 
22
26
  def dispatch(message)
23
- handler_registrar.fetch(message.subject).process(message.body)
27
+ with_named_process(message.subject) do
28
+ handler_registrar.fetch(message.subject).process(message.body)
29
+ end
30
+
24
31
  true # success => true (delete message)
25
32
  rescue Exception => exception
26
33
  @error_handler.call(message, exception)
34
+ false # failure => false (put message back on queue)
27
35
  end
28
36
 
29
37
  private
@@ -0,0 +1,13 @@
1
+ module DispatchRider
2
+ module Dispatcher::NamedProcess
3
+ def with_named_process(subject)
4
+ original_program_name = $0
5
+ begin
6
+ $0 += " - #{subject}"
7
+ yield
8
+ ensure
9
+ $0 = original_program_name
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,4 +1,4 @@
1
1
  # This file specifies the current version of the gem.
2
2
  module DispatchRider
3
- VERSION = "0.0.5"
3
+ VERSION = "0.0.7"
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dispatch-rider
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-20 00:00:00.000000000 Z
12
+ date: 2013-09-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -169,6 +169,7 @@ files:
169
169
  - lib/dispatch-rider/command.rb
170
170
  - lib/dispatch-rider/demultiplexer.rb
171
171
  - lib/dispatch-rider/dispatcher.rb
172
+ - lib/dispatch-rider/dispatcher/named_process.rb
172
173
  - lib/dispatch-rider/errors.rb
173
174
  - lib/dispatch-rider/message.rb
174
175
  - lib/dispatch-rider/notification_services.rb
@@ -213,7 +214,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
213
214
  version: '0'
214
215
  segments:
215
216
  - 0
216
- hash: -2508309376756664510
217
+ hash: -1276525084671356042
217
218
  required_rubygems_version: !ruby/object:Gem::Requirement
218
219
  none: false
219
220
  requirements:
@@ -222,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
222
223
  version: '0'
223
224
  requirements: []
224
225
  rubyforge_project:
225
- rubygems_version: 1.8.23
226
+ rubygems_version: 1.8.25
226
227
  signing_key:
227
228
  specification_version: 3
228
229
  summary: Messaging system based on the reactor patter. You can publish messages to