Project

bug_bunny

0.0
No release in over a year
Gem for sync and async comunication via rabbit bunny.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Runtime

~> 2.24
 Project Readme

BugBunny

Configuration

config/initializers/bug_bunny.rb
BugBunny.configure do |config|
  config.host = 'Host'
  config.username = 'Username'
  config.password = 'Password'
  config.vhost = '/'
  config.logger = Rails.logger
  config.automatically_recover = false
  config.network_recovery_interval = 5
  config.connection_timeout = 10
  config.read_timeout = 30
  config.write_timeout = 30
  config.heartbeat = 15
  config.continuation_timeout = 15_000
end

Publish

Rutas

# config/rabbit_rest.yml
default: &default
  healt_check:
    up: 'healt_check/up'
  manager:
      services:
        index: 'services/index'
        create: 'services/create'
        show: 'services/%<id>s/show'
        update: 'services/%<id>s/update'
        destroy: 'services/%<id>s/destroy'
      swarm:
        info: 'swarm/info'
        version: 'swarm/version'
        swarm: 'swarm/swarm'
      tasks:
        index: 'tasks/index'

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default

Configuration

# config/initializers/bug_bunny.rb
BUG_BUNNY_ENDPOINTS = Rails.application.config_for(:rabbit_rest)

BUNNY_POOL = ConnectionPool.new(size: RABBIT_MAX_THREADS) do
  BugBunny::Rabbit.create_connection(host: RABBIT_HOST, username: RABBIT_USER, password: RABBIT_PASS, vhost: RABBIT_VIRTUAL_HOST)
end

Publisher

Creamos cualquier clase que herede de BugBunny::Publisher, luego definimos metodos de clase y dentro de cada una de ella su implementacion

  1. Mensajes sincronicos
class Rabbit::Publisher::Manager < BugBunny::Publisher
  ROUTING_KEY = :manager
  ROUTES = BUG_BUNNY_ENDPOINTS[:manager][:swarm]

  def self.info(exchange:, message: nil)
    obj = new(pool: NEW_BUNNY_POOL, exchange_name: exchange, action: self::ROUTES[:info], message: message)
    obj.publish_and_consume!
  end

  def self.version(exchange:, message: nil)
    obj = new(pool: NEW_BUNNY_POOL, exchange_name: exchange, action: self::ROUTES[:version], message: message)
    obj.publish_and_consume!
  end
end
  1. Mensajes Asincronicos
class Rabbit::Publisher::Manager < BugBunny::Publisher
  ROUTING_KEY = :manager
  ROUTES = BUG_BUNNY_ENDPOINTS[:manager][:swarm]

  def self.info(exchange:, message: nil)
    obj = new(pool: NEW_BUNNY_POOL, exchange_name: exchange, action: self::ROUTES[:info], message: message)
    obj.publish!
  end

  def self.version(exchange:, message: nil)
    obj = new(pool: NEW_BUNNY_POOL, exchange_name: exchange, action: self::ROUTES[:version], message: message)
    obj.publish!
  end
end
  1. Attributes del objeto BugBunny::Publisher
  • content_type
  • content_encoding
  • correlation_id
  • reply_to
  • message_id
  • timestamp
  • priority
  • expiration
  • user_id
  • app_id
  • action
  • aguments
  • cluster_id
  • persistent
  • expiration

Consumer

class Rabbit::Controllers::Application < BugBunny::Controller
end

class Rabbit::Controllers::Swarm < Rabbit::Controllers::Application
  def info
    render status: :ok, json: Api::Docker.info
  end

  def version
    render status: :ok, json: Api::Docker.version
  end

  def swarm
    render status: :ok, json: Api::Docker.swarm
  end
end

Resource

Solo para recursos que se adaptan al crud de rails estoy utilizando automaticamente la logica de los publicadores. Los atributos solo se ponen si son necesarios, si no la dejas vacia y actua igual que active resource.

class Manager::Application < BugBunny::Resource
  self.resource_path = 'rabbit/publisher/manager'

  attribute :id         # 'ID'
  attribute :version    # 'Version'
  attribute :created_at # 'CreatedAt'
  attribute :update_at  # 'UpdatedAt'
  attribute :spec       # 'Spec'
end

class Manager::Service < Manager::Application
  attribute :endpoint # 'Endpoint'
end

Exceptions

  • Error General:
  • BugBunny::Error hereda de ::StandardError (Captura cualquier error de la gema.)
  • Error de Publicadores:
  • BugBunny::PublishError hereda de BugBunny::Error (Para fallos de envío o conexión.)
  • Error de Respuestas:
  • BugBunny::ResponseError::Base hereda de BugBunny::Error (Captura todos los errores de respuesta).
  • Errores Específicos de Respuesta:
  • BugBunny::ResponseError::BadRequest
  • BugBunny::ResponseError::NotFound
  • BugBunny::ResponseError::NotAcceptable
  • BugBunny::ResponseError::RequestTimeout
  • BugBunny::ResponseError::UnprocessableEntity: En este el error viene el error details a lo rails.
  • BugBunny::ResponseError::InternalServerError