{"id":13878760,"url":"https://github.com/ruby-amqp/hutch","last_synced_at":"2025-05-12T12:11:53.155Z","repository":{"id":6535858,"uuid":"7777086","full_name":"ruby-amqp/hutch","owner":"ruby-amqp","description":"A system for processing messages from RabbitMQ.","archived":false,"fork":false,"pushed_at":"2025-03-24T01:29:36.000Z","size":955,"stargazers_count":871,"open_issues_count":24,"forks_count":142,"subscribers_count":82,"default_branch":"main","last_synced_at":"2025-05-06T07:19:37.468Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://gocardless.com/blog/hutch-inter-service-communication-with-rabbitmq/","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ruby-amqp.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-01-23T15:14:34.000Z","updated_at":"2025-04-28T11:54:48.000Z","dependencies_parsed_at":"2024-05-08T07:41:34.558Z","dependency_job_id":"a24e6102-71c6-4ccf-a1d1-417ea4fda494","html_url":"https://github.com/ruby-amqp/hutch","commit_stats":{"total_commits":763,"total_committers":95,"mean_commits":8.031578947368422,"dds":0.7116644823066842,"last_synced_commit":"544b23ba7cff5d54975c2ac2bf8fb2af3e3bde39"},"previous_names":["gocardless/hutch"],"tags_count":42,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-amqp%2Fhutch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-amqp%2Fhutch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-amqp%2Fhutch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-amqp%2Fhutch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruby-amqp","download_url":"https://codeload.github.com/ruby-amqp/hutch/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253736096,"owners_count":21955783,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-06T08:01:59.089Z","updated_at":"2025-05-12T12:11:53.133Z","avatar_url":"https://github.com/ruby-amqp.png","language":"Ruby","funding_links":[],"categories":["Ruby"],"sub_categories":[],"readme":"![](http://cl.ly/image/3h0q3F3G142K/hutch.png)\n\n[![Gem Version](https://badge.fury.io/rb/hutch.svg)](http://badge.fury.io/rb/hutch)\n[![Code Climate](https://codeclimate.com/github/gocardless/hutch.svg)](https://codeclimate.com/github/gocardless/hutch)\n\nHutch is a Ruby library for enabling asynchronous inter-service communication\nin a service-oriented architecture, using RabbitMQ.\n\nTo install with RubyGems:\n\n```\ngem install hutch\n```\n\n\u003c!-- Tocer[start]: Auto-generated, don't remove. --\u003e\n\n### Table of Contents\n\n  - [Requirements](#requirements)\n  - [Overview](#overview)\n    - [Project Maturity](#project-maturity)\n  - [Consumers](#consumers)\n    - [Message Processing Tracers](#message-processing-tracers)\n  - [Running Hutch](#running-hutch)\n    - [Loading Consumers](#loading-consumers)\n    - [Stopping Hutch](#stopping-hutch)\n  - [Producers](#producers)\n    - [Producer Configuration](#producer-configuration)\n    - [Publisher Confirms](#publisher-confirms)\n    - [Writing Well-Behaved Publishers](#writing-well-behaved-publishers)\n  - [Configuration](#configuration)\n    - [Config File](#config-file)\n    - [Environment variables](#environment-variables)\n    - [Configuration precedence](#configuration-precedence)\n    - [Generated list of configuration options](#generated-list-of-configuration-options)\n\n\u003c!-- Tocer[finish]: Auto-generated, don't remove. --\u003e\n\n## Requirements\n\n- Hutch requires Ruby 2.4+ or JRuby 9K.\n- Hutch requires RabbitMQ 3.3 or later.\n\n## Overview\n\nHutch is a conventions-based framework for writing services that communicate\nover RabbitMQ. Hutch is opinionated: it uses topic exchanges for message\ndistribution and makes some assumptions about how consumers and publishers\nshould work.\n\nWith Hutch, consumers are stored in separate files and include the `Hutch::Consumer` module.\nThey are then loaded by a command line runner which connects to RabbitMQ, sets up queues and bindings,\nand so on. Publishers connect to RabbitMQ via `Hutch.connect` and publish using `Hutch.publish`.\n\nHutch uses [Bunny](http://rubybunny.info) or [March Hare](http://rubymarchhare.info)\n(on JRuby) under the hood.\n\n### Project Maturity\n\nHutch is a mature project that was originally extracted from production systems\nat [GoCardless](https://gocardless.com) in 2013 and is now maintained by its contributors\nand users.\n\n## Consumers\n\nConsumers receive messages from a RabbitMQ queue. That queue may be bound to\none or more topics (represented by routing keys).\n\nTo create a consumer, include the `Hutch::Consumer` module in a class that\ndefines a `#process` method. `#process` should take a single argument, which\nwill be a `Message` object. The `Message` object encapsulates the message data,\nalong with any associated metadata. To access properties of the message, use\nHash-style indexing syntax:\n\n```ruby\nmessage[:id]  # =\u003e \"02ABCXYZ\"\n```\n\nTo subscribe to a topic, pass a routing key to `consume` in the class\ndefinition. To bind to multiple routing keys, simply pass extra routing keys\nin as additional arguments. Refer to the [RabbitMQ docs on topic exchanges\n](http://www.rabbitmq.com/tutorials/tutorial-five-ruby.html) for more information\nabout how to use routing keys. Here's an example consumer:\n\n```ruby\nclass FailedPaymentConsumer\n  include Hutch::Consumer\n  consume 'gc.ps.payment.failed'\n\n  def process(message)\n    mark_payment_as_failed(message[:id])\n  end\nend\n```\n\nBy default, the queue name will be named using the consumer class. You can set\nthe queue name explicitly by using the `queue_name` method:\n\n```ruby\nclass FailedPaymentConsumer\n  include Hutch::Consumer\n  consume 'gc.ps.payment.failed'\n  queue_name 'failed_payments'\n\n  def process(message)\n    mark_payment_as_failed(message[:id])\n  end\nend\n```\n\nIt is possible to set some custom options to consumer's queue explicitly.\nThis example sets the consumer's queue as a\n[quorum queue](https://www.rabbitmq.com/quorum-queues.html)\nand to operate in the [lazy mode](https://www.rabbitmq.com/lazy-queues.html).\nThe `initial_group_size`\n[argument](https://www.rabbitmq.com/quorum-queues.html#replication-factor) is\noptional.\n\n```ruby\nclass FailedPaymentConsumer\n  include Hutch::Consumer\n  consume 'gc.ps.payment.failed'\n  queue_name 'failed_payments'\n  lazy_queue\n  quorum_queue initial_group_size: 3\n\n  def process(message)\n    mark_payment_as_failed(message[:id])\n  end\nend\n```\n\nYou can also set custom arguments per consumer. This example declares a consumer with\na maximum length of 10 messages:\n\n```ruby\nclass FailedPaymentConsumer\n  include Hutch::Consumer\n  consume 'gc.ps.payment.failed'\n  arguments 'x-max-length' =\u003e 10\nend\n```\n\nThis sets the `x-max-length` header. For more details, see the [RabbitMQ\ndocumentation on Queue Length Limit](https://www.rabbitmq.com/maxlength.html). To find out more\nabout custom queue arguments, consult the [RabbitMQ documentation on AMQP Protocol Extensions](https://www.rabbitmq.com/extensions.html).\n\nConsumers can write to Hutch's log by calling the logger method. The logger method returns\na [Logger object](http://ruby-doc.org/stdlib-2.1.2/libdoc/logger/rdoc/Logger.html).\n\n```ruby\nclass FailedPaymentConsumer\n  include Hutch::Consumer\n  consume 'gc.ps.payment.failed'\n\n  def process(message)\n    logger.info \"Marking payment #{message[:id]} as failed\"\n    mark_payment_as_failed(message[:id])\n  end\nend\n```\n\nIf you are using Hutch with Rails and want to make Hutch log to the Rails\nlogger rather than `stdout`, add this to `config/initializers/hutch.rb`\n\n```ruby\nHutch::Logging.logger = Rails.logger\n```\n\nA logger can be set for the client by adding this config before calling `Hutch.connect`\n\n```ruby\nclient_logger = Logger.new(\"/path/to/bunny.log\")\nHutch::Config.set(:client_logger, client_logger)\n```\n\nSee this [RabbitMQ tutorial on topic exchanges](http://www.rabbitmq.com/tutorials/tutorial-five-ruby.html)\nto learn more.\n\n### Message Processing Tracers\n\nTracers allow you to track message processing.\n\nThis will enable NewRelic custom instrumentation:\n\n```ruby\nHutch::Config.set(:tracer, Hutch::Tracers::NewRelic)\n```\n\nAnd this will enable Datadog custom instrumentation:\n\n```ruby\nHutch::Config.set(:tracer, Hutch::Tracers::Datadog)\n```\n\nBatteries included!\n\n## Running Hutch\n\nAfter installing the Hutch gem, you should be able to start it by simply\nrunning `hutch` on the command line. `hutch` takes a number of options:\n\n```console\n$ hutch -h\nusage: hutch [options]\n        --mq-host HOST               Set the RabbitMQ host\n        --mq-port PORT               Set the RabbitMQ port\n    -t, --[no-]mq-tls                Use TLS for the AMQP connection\n        --mq-tls-cert FILE           Certificate  for TLS client verification\n        --mq-tls-key FILE            Private key for TLS client verification\n        --mq-exchange EXCHANGE       Set the RabbitMQ exchange\n        --mq-vhost VHOST             Set the RabbitMQ vhost\n        --mq-username USERNAME       Set the RabbitMQ username\n        --mq-password PASSWORD       Set the RabbitMQ password\n        --mq-api-host HOST           Set the RabbitMQ API host\n        --mq-api-port PORT           Set the RabbitMQ API port\n    -s, --[no-]mq-api-ssl            Use SSL for the RabbitMQ API\n        --config FILE                Load Hutch configuration from a file\n        --require PATH               Require a Rails app or path\n        --[no-]autoload-rails        Require the current rails app directory\n    -q, --quiet                      Quiet logging\n    -v, --verbose                    Verbose logging\n        --version                    Print the version and exit\n    -h, --help                       Show this message and exit\n```\n\nThe first three are for configuring which RabbitMQ instance to connect to.\n`--require` is covered in the next section. Configurations can also be\nspecified in a YAML file for convenience by passing the file location\nto the --config option.  The file should look like:\n\n```yaml\nmq_username: peter\nmq_password: rabbit\nmq_host: broker.yourhost.com\n```\n\nPassing a setting as a command-line option will overwrite what's specified\nin the config file, allowing for easy customization.\n\n### Loading Consumers\n\nUsing Hutch with a Rails app is simple. Either start Hutch in the working\ndirectory of a Rails app, or pass the path to a Rails app in with the\n`--require` option. Consumers defined in Rails apps should be placed with in\nthe `app/consumers/` directory, to allow them to be auto-loaded when Rails\nboots.\n\nIf you're using the new Zeitwerk autoloader (enabled by default in Rails 6)\nand the consumers are not loaded in development environment you will need to\ntrigger the autoloading in an initializer with\n\n```ruby\n::Zeitwerk::Loader.eager_load_all\n```\n\nor with something more specific like\n\n```ruby\nautoloader = Rails.autoloaders.main\n\nDir.glob(File.join('app/consumers', '*_consumer.rb')).each do |consumer|\n  autoloader.preload(consumer)\nend\n```\n\n### Consumer Groups\n\nIt is possible to load only a subset of consumers. This is done by defining a consumer\ngroup under the `consumer_groups` configuration key:\n\n``` yaml\nconsumer_groups:\n  payments:\n    - DepositConsumer\n    - CashoutConsumer\n  notification:\n    - EmailNotificationConsumer\n```\n\nTo only load a group of consumers, use the `--only-group` option:\n\n``` shell\nhutch --only-group=payments --config=/path/to/hutch.yaml\n```\n\n### Loading Consumers Manually (One-by-One)\n\nTo require files that define consumers manually, simply pass each file as an\noption to `--require`. Hutch will automatically detect whether you've provided\na Rails app or a standard file, and take the appropriate behaviour:\n\n```bash\n# loads a rails app\nhutch --require path/to/rails-app\n# loads a ruby file\nhutch --require path/to/file.rb\n```\n\n### Stopping Hutch\n\nHutch supports graceful stops. That means that if done correctly, Hutch will wait for your consumer to finish processing before exiting.\n\nTo gracefully stop your workers, you may send the following signals to your Hutch processes: `INT`, `TERM`, or `QUIT`.\n\n```bash\nkill -SIGINT 123 # or kill -2 123\nkill -SIGTERM 456 # or kill -15 456\nkill -SIGQUIT 789 # or kill -3 789\n```\n\n![](http://g.recordit.co/wyCdzG9Kh3.gif)\n\n## Producers\n\nHutch includes a `publish` method for sending messages to Hutch consumers. When\npossible, this should be used, rather than directly interfacing with RabbitMQ\nlibraries.\n\n```ruby\nHutch.connect\nHutch.publish('routing.key', subject: 'payment', action: 'received')\n```\n\n### Producer Configuration\n\nProducers are not run with the 'hutch' command. You can specify configuration\noptions as follows:\n\n```ruby\nHutch::Config.set(:mq_exchange, 'name')\n```\n\n### Publisher Confirms\n\nFor maximum message reliability when producing messages, you can force Hutch to use\n[Publisher Confirms](https://www.rabbitmq.com/confirms.html) and wait for a confirmation\nafter every message published. This is the safest possible option for publishers\nbut also results in a **significant throughput drop**.\n\n```ruby\nHutch::Config.set(:force_publisher_confirms, true)\n```\n\n### Writing Well-Behaved Publishers\n\nYou may need to send messages to Hutch from languages other than Ruby. This\nprevents the use of `Hutch.publish`, requiring custom publication code to be\nwritten. There are a few things to keep in mind when writing producers that\nsend messages to Hutch.\n\n- Make sure that the producer exchange name matches the exchange name that\n  Hutch is using.\n- Hutch works with topic exchanges, check the producer is also using topic\n  exchanges.\n- Use message routing keys that match those used in your Hutch consumers.\n- Be sure your exchanges are marked as durable. In the Ruby AMQP gem, this is\n  done by passing `durable: true` to the exchange creation method.\n- Publish messages as persistent.\n- Using publisher confirms is highly recommended.\n\nHere's an example of a well-behaved publisher, minus publisher confirms:\n\n```ruby\nAMQP.connect(host: config[:host]) do |connection|\n  channel  = AMQP::Channel.new(connection)\n  exchange = channel.topic(config[:exchange], durable: true)\n\n  message = JSON.dump({ subject: 'Test', id: 'abc' })\n  exchange.publish(message, routing_key: 'test', persistent: true)\nend\n```\n\nIf using publisher confirms with amqp gem, see [this issue](https://github.com/ruby-amqp/amqp/issues/92)\nand [this gist](https://gist.github.com/3042381) for more info.\n\n## Configuration\n\n### Config File\n\nIt is recommended to use a separate config file, unless you use URIs for connection (see below).\n\nKnown configuration parameters are:\n\n * `mq_host`: RabbitMQ hostname (default: `localhost`)\n * `mq_port`: RabbitMQ port (default: `5672`)\n * `mq_vhost`: vhost to use (default: `/`)\n * `mq_username`: username to use (default: `guest`, only can connect from localhost as of RabbitMQ 3.3.0)\n * `mq_password`: password to use (default: `guest`)\n * `mq_tls`: should TLS be used? (default: `false`)\n * `mq_tls_cert`: path to client TLS certificate (public key)\n * `mq_tls_key`: path to client TLS private key\n * `mq_tls_ca_certificates`: array of paths to CA keys (if not specified to Hutch, will default to Bunny defaults which are system-dependent)\n * `mq_verify_peer`: should SSL certificate be verified? (default: `true`)\n * `require_paths`: array of paths to require\n * `autoload_rails`: should Hutch command line runner try to automatically load Rails environment files?\n * `daemonise`: should Hutch runner process daemonise?\n * `pidfile`: path to PID file the runner should use\n * `channel_prefetch`: basic.qos prefetch value to use (default: `0`, no limit). See Bunny and RabbitMQ documentation.\n * `publisher_confirms`: enables publisher confirms. Leaves it up to the app how they are\n                         tracked (e.g. using `Hutch::Broker#confirm_select` callback or `Hutch::Broker#wait_for_confirms`)\n * `force_publisher_confirms`: enables publisher confirms, forces `Hutch::Broker#wait_for_confirms` for every publish. **This is the safest option which also offers the lowest throughput**.\n * `log_level`: log level used by the standard Ruby logger (default: `Logger::INFO`)\n * `error_handlers`: a list of error handler objects, see classes in `Hutch::ErrorHandlers`. All configured\n   handlers will be invoked unconditionally in the order listed.\n * `error_acknowledgements`: a chain of responsibility of objects that acknowledge/reject/requeue messages when an\n    exception happens, see classes in `Hutch::Acknowledgements`.\n * `mq_exchange`: exchange to use for publishing (default: `hutch`)\n * `mq_client_properties`: Bunny's [client properties](https://www.rabbitmq.com/docs/connections#capabilities) (default: `{}`)\n * `heartbeat`: [RabbitMQ heartbeat timeout](http://rabbitmq.com/heartbeats.html) (default: `30`)\n * `connection_timeout`: Bunny's socket open timeout (default: `11`)\n * `read_timeout`: Bunny's socket read timeout (default: `11`)\n * `write_timeout`: Bunny's socket write timeout (default: `11`)\n * `automatically_recover`: Bunny's enable/disable network recovery (default: `true`)\n * `network_recovery_interval`: Bunny's reconnect interval (default: `1`)\n * `tracer`: tracer to use to track message processing\n * `namespace`: A namespace string to help group your queues (default: `nil`)\n\n### Environment variables\n\nThe file configuration options mentioned above can also be passed in via environment variables, using the `HUTCH_` prefix, eg.\n\n * `connection_timeout` \u0026rarr; `HUTCH_CONNECTION_TIMEOUT`.\n\n### Configuration precedence\n\nIn order from lowest to highest precedence:\n\n0. Default values\n0. `HUTCH_*` environment variables\n0. Configuration file\n0. Explicit settings through `Hutch::Config.set`\n\n### Generated list of configuration options\n\nGenerate with\n\n0. `yard doc lib/hutch/config.rb`\n0. Copy the _Configuration_ section from `doc/Hutch/Config.html` here, with the anchor tags stripped.\n\n\u003ctable border=\"1\" class=\"settings\" style=\"overflow:visible;\"\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\n        Setting name\n      \u003c/th\u003e\n      \u003cth\u003e\n        Default value\n      \u003c/th\u003e\n      \u003cth\u003e\n        Type\n      \u003c/th\u003e\n      \u003cth\u003e\n        ENV variable\n      \u003c/th\u003e\n      \u003cth\u003e\n        Description\n      \u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003emq_host\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e127.0.0.1\u003c/td\u003e\n      \u003ctd\u003eString\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_MQ_HOST\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eRabbitMQ hostname\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003emq_exchange\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003ehutch\u003c/td\u003e\n      \u003ctd\u003eString\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_MQ_EXCHANGE\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eRabbitMQ Exchange to use for publishing\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003emq_exchange_type\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003etopic\u003c/td\u003e\n      \u003ctd\u003eString\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_MQ_EXCHANGE_TYPE\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eRabbitMQ Exchange type to use for publishing\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003emq_vhost\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e/\u003c/td\u003e\n      \u003ctd\u003eString\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_MQ_VHOST\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eRabbitMQ vhost to use\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003emq_username\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003eguest\u003c/td\u003e\n      \u003ctd\u003eString\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_MQ_USERNAME\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eRabbitMQ username to use.\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003emq_password\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003eguest\u003c/td\u003e\n      \u003ctd\u003eString\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_MQ_PASSWORD\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eRabbitMQ password\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003euri\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003enil\u003c/td\u003e\n      \u003ctd\u003eString\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_URI\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eRabbitMQ URI (takes precedence over MQ username, password, host, port and vhost settings)\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003emq_api_host\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e127.0.0.1\u003c/td\u003e\n      \u003ctd\u003eString\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_MQ_API_HOST\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eRabbitMQ HTTP API hostname\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003emq_port\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e5672\u003c/td\u003e\n      \u003ctd\u003eNumber\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_MQ_PORT\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eRabbitMQ port\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003emq_api_port\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e15672\u003c/td\u003e\n      \u003ctd\u003eNumber\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_MQ_API_PORT\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eRabbitMQ HTTP API port\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003eheartbeat\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e30\u003c/td\u003e\n      \u003ctd\u003eNumber\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_HEARTBEAT\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003e\u003ca href=\"http://rabbitmq.com/heartbeats.html\"\u003eRabbitMQ heartbeat timeout\u003c/a\u003e\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003echannel_prefetch\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e0\u003c/td\u003e\n      \u003ctd\u003eNumber\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_CHANNEL_PREFETCH\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eThe \u003ctt\u003ebasic.qos\u003c/tt\u003e prefetch value to use.\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003econnection_name\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003enil\u003c/td\u003e\n      \u003ctd\u003eString\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_CONNECTION_NAME\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003e\u003ca href=\"https://www.rabbitmq.com/docs/connections#client-provided-names\"\u003eClient-Provided Connection Name\u003c/a\u003e\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003econnection_timeout\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e11\u003c/td\u003e\n      \u003ctd\u003eNumber\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_CONNECTION_TIMEOUT\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eBunny's socket open timeout\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003eread_timeout\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e11\u003c/td\u003e\n      \u003ctd\u003eNumber\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_READ_TIMEOUT\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eBunny's socket read timeout\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003ewrite_timeout\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e11\u003c/td\u003e\n      \u003ctd\u003eNumber\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_WRITE_TIMEOUT\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eBunny's socket write timeout\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003eautomatically_recover\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003etrue\u003c/td\u003e\n      \u003ctd\u003eBoolean\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_AUTOMATICALLY_RECOVER\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eBunny's enable/disable network recovery\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003enetwork_recovery_interval\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003eNumber\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_NETWORK_RECOVERY_INTERVAL\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eBunny's reconnect interval\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003egraceful_exit_timeout\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e11\u003c/td\u003e\n      \u003ctd\u003eNumber\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_GRACEFUL_EXIT_TIMEOUT\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eFIXME: DOCUMENT THIS\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003econsumer_pool_size\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e1\u003c/td\u003e\n      \u003ctd\u003eNumber\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_CONSUMER_POOL_SIZE\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eBunny consumer work pool size\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003emq_tls\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003efalse\u003c/td\u003e\n      \u003ctd\u003eBoolean\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_MQ_TLS\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eShould TLS be used?\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003emq_verify_peer\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003etrue\u003c/td\u003e\n      \u003ctd\u003eBoolean\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_MQ_VERIFY_PEER\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eShould SSL certificate be verified?\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003emq_api_ssl\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003efalse\u003c/td\u003e\n      \u003ctd\u003eBoolean\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_MQ_API_SSL\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eShould SSL be used for the RabbitMQ API?\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003eautoload_rails\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003etrue\u003c/td\u003e\n      \u003ctd\u003eBoolean\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_AUTOLOAD_RAILS\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eShould the current Rails app directory be required?\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003edaemonise\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003efalse\u003c/td\u003e\n      \u003ctd\u003eBoolean\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_DAEMONISE\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eShould the Hutch runner process daemonise?\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003epublisher_confirms\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003efalse\u003c/td\u003e\n      \u003ctd\u003eBoolean\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_PUBLISHER_CONFIRMS\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eShould RabbitMQ publisher confirms be enabled?\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003eforce_publisher_confirms\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003efalse\u003c/td\u003e\n      \u003ctd\u003eBoolean\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_FORCE_PUBLISHER_CONFIRMS\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eEnables publisher confirms, forces Hutch::Broker#wait_for_confirms for\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003eenable_http_api_use\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003etrue\u003c/td\u003e\n      \u003ctd\u003eBoolean\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_ENABLE_HTTP_API_USE\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eShould the RabbitMQ HTTP API be used?\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003econsumer_pool_abort_on_exception\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003efalse\u003c/td\u003e\n      \u003ctd\u003eBoolean\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_CONSUMER_POOL_ABORT_ON_EXCEPTION\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eShould Bunny's consumer work pool threads abort on exception.\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003econsumer_tag_prefix\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003ehutch\u003c/td\u003e\n      \u003ctd\u003eString\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_CONSUMER_TAG_PREFIX\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003ePrefix displayed on the consumers tags.\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003enamespace\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003enil\u003c/td\u003e\n      \u003ctd\u003eString\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_NAMESPACE\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003cp\u003eA namespace to help group your queues\u003c/p\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e\u003ctt\u003egroup\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e''\u003c/td\u003e\n      \u003ctd\u003eString\u003c/td\u003e\n      \u003ctd\u003e\u003ctt\u003eHUTCH_GROUP\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruby-amqp%2Fhutch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fruby-amqp%2Fhutch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruby-amqp%2Fhutch/lists"}