PTT - messaging based on RabbitMQ and some conventions. It's built on top of Bunny gem.
- Messages are JSON-encoded strings
- Consumers decode JSON payload and call message handlers
- Publisher uses just direct AMQP exchange (however it might change later)
- By default rejected messages are not requeued.
Add this line to your application's Gemfile:
gem 'ptt'
And then execute:
$ bundle
Or install it yourself as:
$ gem install ptt
First of all you should register message handlers. A handler object should
respond to #call
method. When consumer receives a message from RabbitMQ, it
decodes JSON payload and passes decoded data to the designated handler using
#call
method.
# Message handler
class Handler
def call(data)
# process received data
# ...
end
end
# In this case `Handler#call` will be called each time when a new message comes
# from RabbitMQ with routing key `foo`
PTT.configure do |pneumatic_tube|
pneumatic_tube.register_handler('foo', Handler.new)
end
When you need to send a message, just call PTT.publish
. You have to provide
data and routing key. PTT publisher will encode data to JSON format and will
publish it to the exchange with given routing key.
data = { foo: 'bar' }
# JSON encoded data will be send to exchange with `bar` routing key
PTT.publish('bar', data)
In case you need to requeue rejected messages there are two option available:
-
Via environment variable:
PTT_DEFAULT_RETRY=true
. This will override the default requeue value for the whole project. -
Per handler, example:
class CarefulHandler
def call(json)
# do some work
end
def requeue?(error)
# computes result based on the given error or
# any other internal logic, e.g. requeue on
# specific exceptions, but do not requeue in other cases.
end
end
class CarelessHandler
def call(json)
# do some work
end
def requeue?(_)
# in case of any failure simply drop messages from
# the queue and don't even try anything else.
return false
end
end
$ script/test
- Fork it ( https://github.com/[my-github-username]/ptt/fork )
- 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 a new Pull Request
(c) 2018 Alexander Sulim