caerbannog 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +80 -5
- data/Rakefile +1 -1
- data/bin/console +4 -4
- data/caerbannog.gemspec +23 -24
- data/circle.yml +3 -0
- data/lib/caerbannog/queue.rb +9 -9
- data/lib/caerbannog/version.rb +1 -1
- data/lib/caerbannog.rb +17 -5
- data/lib/generators/caerbannog_generator.rb +6 -6
- data/lib/generators/templates/caerbannog_initializer.rb +5 -1
- metadata +4 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 023d6338359111413e0f62e40ec72aa34442e002
|
4
|
+
data.tar.gz: 6a54db3d5aac7ab4deced6c17e2100473a513ea4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7181df709957bb02a3ef3f3959ca1641382b2847c811c7a36b4266d2c609e18b33a3c1a90570a4a94e4a3c73a45ab4adb9123cf5f53877dfb52363af47286bb5
|
7
|
+
data.tar.gz: 693e29df25da07ec0902af3892dde90ff7bd8621bdf5caee0c636de9f0ae3805c34e3112f37d9da88e7dadc3a5c83a4b5003785b7677bf0b43b61b41c2bbb451
|
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# Caerbannog
|
2
|
+
[](https://circleci.com/gh/magplus/caerbannog)
|
2
3
|
|
3
|
-
|
4
|
+
Implements a database buffer and workers for sending and receiving events
|
5
|
+
to/from RabbitMQ.
|
4
6
|
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
6
7
|
|
7
8
|
## Installation
|
8
9
|
|
@@ -22,13 +23,87 @@ Or install it yourself as:
|
|
22
23
|
|
23
24
|
## Usage
|
24
25
|
|
25
|
-
|
26
|
+
The gem is meant to be used by a sender application and one or more receiver
|
27
|
+
applications.
|
28
|
+
|
29
|
+
### On the sender side
|
30
|
+
|
31
|
+
Caerbannog needs to be configured with a message storage class that is an
|
32
|
+
ActiveRecord model or works like an ActiveRecord model with regards to the
|
33
|
+
methods `.all`, `.create!` and `#destroy`, and has two attributes `name` and
|
34
|
+
`payload`. It also needs a RabbitMQ read and a write URL.
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
Caerbannog.configure do |config|
|
38
|
+
config.message_class = MessageQueueMessage
|
39
|
+
config.rabbit_read_url = ENV['RABBIT_URL']
|
40
|
+
config.rabbit_write_url = ENV['RABBIT_URL']
|
41
|
+
end
|
42
|
+
```
|
43
|
+
|
44
|
+
If you are using the gem from within a Rails application, you can run the
|
45
|
+
following to generate this model and the configuration:
|
46
|
+
|
47
|
+
$ rails generate caerbannog
|
48
|
+
|
49
|
+
This generates a migration file, an ActiveRecord message class
|
50
|
+
`MessageQueueMessage`, and an initializer file.
|
51
|
+
|
52
|
+
This class will be used to store messages when you call
|
53
|
+
`Caerbannog::Queue.push`, before they are sent to RabbitMQ,
|
54
|
+
|
55
|
+
Call the `Caerbannog::Queue.push` method with two parameters: the message name,
|
56
|
+
that will be used as the routing key in RabbitMQ, and the message payload,
|
57
|
+
which should be a hash or an array.
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
Caerbannog::Queue.push('message name', { one_field: 'one', two_field: 'two' })
|
61
|
+
```
|
62
|
+
|
63
|
+
We then need a background publisher that uses the `all` method of the message
|
64
|
+
class to fetch all pushed messages and send them to RabbitMQ, and then
|
65
|
+
`destroy`s them.
|
66
|
+
|
67
|
+
If you have initialized the `Caerbannog::Queue#message_class=`, you can use
|
68
|
+
something like this to start the publisher process:
|
69
|
+
|
70
|
+
$ bundle exec rails runner 'Caerbannog::Queue.publish'
|
71
|
+
|
72
|
+
### On the receiving side
|
73
|
+
|
74
|
+
To receive messages you need to run a subscriber process that calls the
|
75
|
+
`Caerbannog::Queue.subscribe` method. An example subscriber class with some
|
76
|
+
error handling might look like this:
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
class MessageQueueWorker
|
80
|
+
def perform
|
81
|
+
Caerbannog::Queue.subscribe('my-apps-queue-name', 'message-name1', 'message-name2') do |delivery_info, properties, payload|
|
82
|
+
parsed_message = JSON.parse(payload)
|
83
|
+
# Do something with the parsed message
|
84
|
+
end
|
85
|
+
rescue Bunny::TCPConnectionFailedForAllHosts => e
|
86
|
+
puts 'Oh no' # Handle the error somehow
|
87
|
+
sleep 10 # Wait for RabbitMQ to come back up
|
88
|
+
retry # Try to reconnect
|
89
|
+
end
|
90
|
+
end
|
91
|
+
```
|
92
|
+
|
93
|
+
and you might run this process like
|
94
|
+
|
95
|
+
$ bundle exec rails runner 'MessageQueueWorker'
|
26
96
|
|
27
97
|
## Development
|
28
98
|
|
29
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
99
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
100
|
+
`bin/console` for an interactive prompt that will allow you to experiment.
|
30
101
|
|
31
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To
|
102
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To
|
103
|
+
release a new version, update the version number in `version.rb`, and then run
|
104
|
+
`bundle exec rake release` to create a git tag for the version, push git
|
105
|
+
commits and tags, and push the `.gem` file to
|
106
|
+
[rubygems.org](https://rubygems.org).
|
32
107
|
|
33
108
|
## Contributing
|
34
109
|
|
data/Rakefile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
2
|
|
data/bin/console
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'caerbannog'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
9
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require
|
10
|
+
# require 'pry'
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/caerbannog.gemspec
CHANGED
@@ -4,40 +4,39 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'caerbannog/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'caerbannog'
|
8
8
|
spec.version = Caerbannog::VERSION
|
9
9
|
spec.authors = [
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
'Dennis Rogenius',
|
11
|
+
'Karl Eklund',
|
12
|
+
'Kristoffer Roupé',
|
13
|
+
'Lennart Fridén',
|
14
|
+
'Martin Svalin',
|
15
|
+
'Mikael Amborn',
|
16
|
+
'Victoria Wagman'
|
17
17
|
]
|
18
18
|
spec.email = [
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
19
|
+
'dennis@magplus.com',
|
20
|
+
'karl@magplus.com',
|
21
|
+
'kristoffer@maglus.com',
|
22
|
+
'lennart@magplus.com',
|
23
|
+
'martin@magplus.com',
|
24
|
+
'mikael.amborn@magplus.com',
|
25
|
+
'victoria@magplus.com'
|
26
26
|
]
|
27
27
|
|
28
28
|
spec.summary = %q{Library for handling messages}
|
29
29
|
spec.description = %q{Implements a database buffer and workers for sending events to RabbitMQ}
|
30
|
-
spec.homepage =
|
31
|
-
spec.license =
|
30
|
+
spec.homepage = 'https://github.com/magplus/caerbannog'
|
31
|
+
spec.license = 'MIT'
|
32
32
|
|
33
33
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
34
34
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
35
|
-
spec.require_paths = [
|
35
|
+
spec.require_paths = ['lib']
|
36
|
+
spec.required_ruby_version = '>= 2.0.0'
|
36
37
|
|
37
|
-
spec.add_development_dependency
|
38
|
-
spec.add_development_dependency
|
39
|
-
spec.add_development_dependency
|
40
|
-
spec.
|
41
|
-
|
42
|
-
spec.add_dependency "bunny"
|
38
|
+
spec.add_development_dependency 'rake', "~> 10.0"
|
39
|
+
spec.add_development_dependency 'mocha'
|
40
|
+
spec.add_development_dependency 'rspec'
|
41
|
+
spec.add_dependency 'bunny'
|
43
42
|
end
|
data/circle.yml
ADDED
data/lib/caerbannog/queue.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
module Caerbannog
|
2
2
|
class Queue
|
3
|
-
def self.message_class=(message_class)
|
4
|
-
@message_class = message_class
|
5
|
-
end
|
6
|
-
|
7
3
|
def self.push(name, payload)
|
8
|
-
|
4
|
+
raise ConfigurationError.new("Must configure #{self.name} with message_class") unless Caerbannog.message_class
|
5
|
+
|
6
|
+
Caerbannog.message_class.create!(:name => name, :payload => JSON.generate(payload))
|
9
7
|
end
|
10
8
|
|
11
|
-
def self.rabbitmq
|
12
|
-
|
9
|
+
def self.rabbitmq(rabbit_url)
|
10
|
+
raise ConfigurationError.new("Must configure #{self.name} with rabbit_read_url and/or rabbit_write_url") unless rabbit_url
|
11
|
+
|
12
|
+
Bunny.run rabbit_url do |conn|
|
13
13
|
ch = conn.create_channel
|
14
14
|
exchange = ch.direct('events', :durable => true)
|
15
15
|
yield exchange, ch
|
@@ -17,7 +17,7 @@ module Caerbannog
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def self.subscribe(queue_name, *routing_keys, &block)
|
20
|
-
rabbitmq do |exchange, channel|
|
20
|
+
rabbitmq Caerbannog.rabbit_read_url do |exchange, channel|
|
21
21
|
queue = channel.queue(queue_name)
|
22
22
|
routing_keys.each { |routing_key| queue.bind(exchange, :routing_key => routing_key) }
|
23
23
|
queue.subscribe(:block => true, &block)
|
@@ -25,7 +25,7 @@ module Caerbannog
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def self.publish(messages = MessagePoller.new(@message_class))
|
28
|
-
rabbitmq do |exchange|
|
28
|
+
rabbitmq Caerbannog.rabbit_write_url do |exchange|
|
29
29
|
messages.each do |message|
|
30
30
|
exchange.publish(message.payload, :routing_key => message.name, :persistent => true)
|
31
31
|
message.destroy
|
data/lib/caerbannog/version.rb
CHANGED
data/lib/caerbannog.rb
CHANGED
@@ -1,7 +1,19 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'bunny'
|
3
3
|
require 'json'
|
4
4
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
5
|
+
require 'caerbannog/version'
|
6
|
+
require 'caerbannog/message_poller'
|
7
|
+
require 'caerbannog/queue'
|
8
|
+
|
9
|
+
module Caerbannog
|
10
|
+
class ConfigurationError < StandardError; end
|
11
|
+
|
12
|
+
class << self
|
13
|
+
attr_accessor :message_class, :rabbit_read_url, :rabbit_write_url
|
14
|
+
|
15
|
+
def configure
|
16
|
+
yield self
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,21 +1,21 @@
|
|
1
1
|
class CaerbannogGenerator < Rails::Generators::Base
|
2
2
|
include Rails::Generators::Migration
|
3
3
|
source_root File.expand_path('../templates', __FILE__)
|
4
|
-
|
4
|
+
|
5
5
|
def self.next_migration_number(path)
|
6
|
-
Time.now.utc.strftime(
|
6
|
+
Time.now.utc.strftime('%Y%m%d%H%M%S')
|
7
7
|
end
|
8
8
|
|
9
9
|
def copy_migration
|
10
|
-
migration_template
|
10
|
+
migration_template 'add_caerbannog_messages.rb', 'db/migrate/add_caerbannog_messages.rb'
|
11
11
|
end
|
12
12
|
|
13
13
|
def create_message_model
|
14
|
-
copy_file
|
14
|
+
copy_file 'caerbannog_message.rb', 'app/models/caerbannog_message.rb'
|
15
15
|
end
|
16
16
|
|
17
17
|
def create_caerbannog_initializer
|
18
|
-
copy_file
|
18
|
+
copy_file 'caerbannog_initializer.rb', 'config/initializers/caerbannog_initializer.rb'
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
21
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: caerbannog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dennis Rogenius
|
@@ -14,22 +14,8 @@ authors:
|
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
|
-
date: 2015-03-
|
17
|
+
date: 2015-03-20 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
|
-
- !ruby/object:Gem::Dependency
|
20
|
-
name: bundler
|
21
|
-
requirement: !ruby/object:Gem::Requirement
|
22
|
-
requirements:
|
23
|
-
- - "~>"
|
24
|
-
- !ruby/object:Gem::Version
|
25
|
-
version: '1.8'
|
26
|
-
type: :development
|
27
|
-
prerelease: false
|
28
|
-
version_requirements: !ruby/object:Gem::Requirement
|
29
|
-
requirements:
|
30
|
-
- - "~>"
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '1.8'
|
33
19
|
- !ruby/object:Gem::Dependency
|
34
20
|
name: rake
|
35
21
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,6 +96,7 @@ files:
|
|
110
96
|
- bin/console
|
111
97
|
- bin/setup
|
112
98
|
- caerbannog.gemspec
|
99
|
+
- circle.yml
|
113
100
|
- lib/caerbannog.rb
|
114
101
|
- lib/caerbannog/message_poller.rb
|
115
102
|
- lib/caerbannog/queue.rb
|
@@ -130,7 +117,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
130
117
|
requirements:
|
131
118
|
- - ">="
|
132
119
|
- !ruby/object:Gem::Version
|
133
|
-
version:
|
120
|
+
version: 2.0.0
|
134
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
122
|
requirements:
|
136
123
|
- - ">="
|