EventBus
EventBus provides additional messaging patterns for EmpregoLigado applications. It exposes some methods for messaging-related features: - EventBus::Emitter.trigger(event) - EventBus::Listener.on(event_name) - Extending EventBus::Listeners::Base
Let’s look at a diagram for EventBus:
Installation
Add this line to your application’s Gemfile:
ruby
gem 'event_bus_rb'
And then execute:
$ bundle
Or install it yourself as:
$ gem install event_bus_rb
And set env vars:
ruby
ENV['RABBIT_URL'] = 'amqp://guest:guest@localhost:5672'
ENV['RABBIT_EVENT_BUS_APP_NAME'] = 'EventBusExampleApp'
ENV['RABBIT_EVENT_BUS_VHOST'] = 'event_bus'
ENV['RABBIT_EVENT_BUS_TOPIC_NAME'] = 'event_bus'
`
Usage
Emitter
A application can trigger events based passing an EventBus::Event instance, so others systems that listens to these events based matching the routing key (used as event_name below) will receive the event payload content.
```ruby require ‘event_bus_rb’
event_name = ‘resource.origin.action’ body = { resource: ‘full’ } event = EventBus::Event.new(event_name, body)
EventBus::Emitter.trigger(event)
EventBus::Config.broker.close_connection ``` See more details
Listeners
An application that uses EventBus
to handle events should be treated as a
daemon like any other. The Listener
api handles the blocking looping system,
so the client doesn`t need to think about those implementation details.
```ruby require ‘event_bus_rb’
event_name = ‘resource.origin.action’
puts ‘Start receiving messages’
EventBus::Listener.on(event_name) do |event, _delivery_info| puts “” puts “ - Received a message from #eventevent.name:” puts “ Message: #eventevent.body” puts “” end
puts ‘Stop receiving messages’
EventBus::Config.broker.close_connection ```
Multiple events routing
If your application needs to handle with loads of events you can extends EventBus::Listeners::Base
and bind events to methods.
A simplistic example can be written like so:
```ruby require ‘event_bus_rb’
class CustomEventListener < EventBus::Listeners::Base bind :pay, ‘resource.custom.pay’ bind :receive, ‘resource.custom.receive’
def pay(event, delivery_info) puts “Paid #eventevent.body[‘amount’] for #eventevent.body[‘name’] ~> #eventevent.name”
channel.ack(delivery_info.delivery_tag, false) end
def receive(event, delivery_info) puts “Received #eventevent.body[‘amount’] from #eventevent.body[‘name’] ~> #eventevent.name”
channel.ack(delivery_info.delivery_tag, false) end end ``` [See more details](https://github.com/EmpregoLigado/event_bus_rb/blob/master/examples/daemon.rb)
You can also bind more than one routing keys to methods using *
or #
.
Using resource.*.pay
, for example, you can bind routing keys prefixed by resource. and suffixed by .pay to a method:
# bind resource.everything.pay to pay method
bind :pay, 'resource.*.pay'
Using #
, you can bind all routing keys to a method:
# bind everything to receive method
bind :receive, '#'
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run bundle exec rspec
to run the tests. You can also run bin/console
for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
. To release a new version, update the version number in version.rb
, and then run bundle exec rake release
, which will create a git tag for the version, push git commits and tags, and push the .gem
file to rubygems.org.
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request
License
The gem is available as open source under the terms of the MIT License.