{"id":18613047,"url":"https://github.com/eduzz/hermes","last_synced_at":"2025-11-03T01:30:28.658Z","repository":{"id":52610606,"uuid":"168385959","full_name":"eduzz/hermes","owner":"eduzz","description":null,"archived":false,"fork":false,"pushed_at":"2022-08-31T17:24:14.000Z","size":45,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":25,"default_branch":"master","last_synced_at":"2025-01-27T03:13:38.528Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eduzz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-01-30T17:36:28.000Z","updated_at":"2022-01-18T13:12:38.000Z","dependencies_parsed_at":"2022-09-22T14:24:54.891Z","dependency_job_id":null,"html_url":"https://github.com/eduzz/hermes","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eduzz%2Fhermes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eduzz%2Fhermes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eduzz%2Fhermes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eduzz%2Fhermes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eduzz","download_url":"https://codeload.github.com/eduzz/hermes/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239406441,"owners_count":19633024,"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-11-07T03:19:40.255Z","updated_at":"2025-11-03T01:30:28.629Z","avatar_url":"https://github.com/eduzz.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hermes\n\nEssa Lib é responsável por encapsular a conexão com gerenciadores de filas. Focando no uso com [RabbitMQ](http://www.rabbitmq.com/).\n\n** Dependências: PHP 5.3 ** Devido ao uso de namespaces.\n\n** Dependências: bcmath e mbstring ** Devido ao uso do [php-amqplib](https://github.com/php-amqplib/php-amqplib/) para conexão através do protocolo AMQP 0-9-1.\n\n## Instalação\n\nPrimeiro, vamos adicionar a dependência e o repositório do hermes no nosso arquivo composer.json:\n\n```json\n{\n    \"require\": {\n        \"eduzz/hermes\": \"dev-master\"\n    },\n    \"repositories\": [\n        {\n            \"type\": \"vcs\",\n            \"url\":  \"git@github.com:eduzz/hermes.git\"\n        }\n    ]\n}\n```\n\nApós, vamos rodar o comando\n\n```\ncomposer dump-autoload\n```\n\nPara atualizar o cache do composer\n\n```\ncomposer install\n```\n\nPara instalar as dependência e o hermes\n\nPS: É preciso verificar se você está com a chave conectada ao github no shell onde vai instalar o hermes.\n\n## Instalação em projeto Laravel\n\nO próximo passo é registrar o Hermes na lista de service providers, dentro do seu config/app.php, adicione o Hermes na sua lista de providers e adiciona também a facade do Hermes na lista de aliases.\n\n```php\n'providers' =\u003e [\n    // ...\n\n    Eduzz\\Hermes\\HermesLaravelServiceProvider::class,\n],\n```\n\n```php\n'aliases' =\u003e [\n    // ...\n\n    'Hermes' =\u003e Eduzz\\Hermes\\Facades\\HermesFacade::class,\n],\n```\n\nPrecisamos limpar nosso cache, atualizar nossos pacotes e publicar a configuração do hermes:\n\n```bash\nphp artisan cache:config\ncomposer update\nphp artisan vendor:publish --tag=\"config\"\n```\n\nSe tudo ocorreu bem, a seguinte mensagem sera exibida:\n\n```bash\nCopied File [/vendor/eduzz/src/Config/hermes.php] To [/config/hermes.php]\n```\n\nEntão, é necessário configurar o hermes, no arquivo config/hermes.php, na variável connection, é onde devem ficar os seus dados de conexão, por exemplo:\n\n```php\n\u003c?php\n\nreturn [\n    'connection' =\u003e  [\n        'host' =\u003e env('HERMES_HOST', '127.0.0.1'),\n        'port' =\u003e env('HERMES_PORT', 5672),\n        'username' =\u003e env('HERMES_USERNAME', 'guest'),\n        'password' =\u003e env('HERMES_PASSWORD', 'guest'),\n        'vhost' =\u003e env('HERMES_VHOST', '/'),\n        'connection_name' =\u003e env('HERMES_CONNECTION_NAME', '/'),\n    ]\n];\n```\n\n### Instalação em projeto Lumen\n\nPara instalação em projeto lumen, é preciso criar o arquivo de configuração na mão, vamos adicionar um arquivo chamado hermes.php na pasta config com o seguinte conteúdo:\n\n```php\n\u003c?php\n\nreturn [\n    'connection' =\u003e  [\n        'host' =\u003e env('HERMES_HOST', '127.0.0.1'),\n        'port' =\u003e env('HERMES_PORT', 5672),\n        'username' =\u003e env('HERMES_USERNAME', 'guest'),\n        'password' =\u003e env('HERMES_PASSWORD', 'guest'),\n        'vhost' =\u003e env('HERMES_VHOST', '/'),\n        'connection_name' =\u003e env('HERMES_CONNECTION_NAME', '/'),\n    ]\n];\n```\n\nVamos também adicionar nosso service provider no register, então na pasta bootstrap/app.php, procure pela linha que faz os registros e adicione:\n\n```php\n\u003c?php\n// ...\n$app-\u003eregister(Eduzz\\Hermes\\HermesLaravelServiceProvider::class);\n// ...\n```\n\nAdicione também a chamada para a configuração do hermes no bootstrap/app.php:\n\n```php\n\u003c?php\n$app-\u003econfigure('hermes');\n\nreturn $app;\n```\n\n## Instalação em um projeto sem framework Illuminate\n\nPara utilizar o Hermes sem laravel/lumen, é necessário setar as configurações na mão, exemplo:\n\n```php\n\u003c?php\n\nrequire 'vendor/autoload.php';\n\nuse Eduzz\\Hermes\\Hermes;\n\n$hermes = new Hermes([\n\t'host'  =\u003e  '127.0.0.1',\n\t'port' =\u003e 5672,\n\t'username' =\u003e 'guest',\n\t'password' =\u003e 'guest',\n\t'vhost' =\u003e '/'\n]);\n\n```\n\nHá um método chamado setConfig, onde, as configurações podem ser atualizadas, caso você não queira passar pelo construtor.\n\n# Usage\n\nO Hermes possui 2 interações com o rabbitMQ, declarar filas, consumir as filas e enviar mensagens.\n\n## Enviando mensagens\n\n### Definindo as mensagens\n\nPara definir uma nova mensagem, é necessário estender nossa mensagem abstrata:\n\n```php\n\u003c?php\n\nnamespace App\\HermesMessages;\n\nuse Eduzz\\Hermes\\Message\\AbstractMessage;\n\nclass ExampleMessage extends AbstractMessage\n{\n    public function __construct($id, $message)\n    {\n        parent::__construct(\n            // Sua routing Key\n            'app.module.action',\n\n            // Seu payload\n            ['id' =\u003e $id, 'message' =\u003e $message]\n        );\n    }\n}\n\n```\nDentro da sua mensagem, não importa a lógica, você pode passar qualquer dado, porém, a mensagem do hermes precisa receber sempre 1 string que é a routingKey, e o segundo parâmetro um array de dados quaisquer.\n\n### Enviando mensagens em Laravel/Lumen\n\nVamos utilizar a injeção de dependência do laravel para instanciar o Hermes já pegando as configurações do arquivo config/hermes.php, exemplo de um controller do laravel utilizando o hermes:\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Routing\\Controller as BaseController;\nuse Eduzz\\Hermes\\Hermes;\n\nuse App\\HermesMessages\\ExampleMessage;\n\nclass Controller extends BaseController\n{\n    private $hermes;\n\n    public function __construct(Hermes $hermes) {\n        $this-\u003ehermes = $hermes;\n\n        parent::__construct();\n    }\n\n    public function method() {\n        // Sua lógica aqui\n\n        $this-\u003ehermes-\u003epublish(\n            new ExampleMessage(5, 'Hello world'),\n            'my_exchange' // Paramêtro opcional, qual exchange a mensagem deve ir\n        );\n    }\n}\n\n```\n\nO segundo paramêtro do método publish (exchange) é opcional, ele é a exchange para onde a mensagem vai, por padrão, é utilizada uma exchange com o nome 'eduzz'.\n\n### Enviando mensagens com Hermes sem Framework\n\nA lógica é a mesma, porém, passando as configurações no construtor ou através do setConfig, exemplo:\nreturn array(\n    'connection' =\u003e  array(\n        'host' =\u003e env('HERMES_HOST', '127.0.0.1'),\n        'port' =\u003e env('HERMES_PORT', 5672),\n        'username' =\u003e env('HERMES_USERNAME', 'guest'),\n        'password' =\u003e env('HERMES_PASSWORD', 'guest'),\n        'vhost' =\u003e env('HERMES_VHOST', '/').\n        'connection_name' =\u003e env('HERMES_CONNECTION_NAME', '/'),\n    )\n);\n```php\n\u003c?php\n\n$hermes-\u003epublish(\n    new Message(\n        [\n            \"id\" =\u003e 123,\n            \"name\" =\u003e \"John Doe\",\n            \"age\" =\u003e 18\n        ],\n        'my_exchange' // Paramêtro opcional, qual exchange a mensagem deve ir\n    );\n);\n\n```\n\n## Declarando e consumindo filas\n\n### Adicionando novas filas\n\nPara consumir uma fila no modo de trabalho das nossas exchange (topic), é preciso declarar uma fila e fazer um 'bind', um bind é ligar uma fila a uma routingKey, ou seja, dizer que, mensagens que possuam um certa routingKey, irão para uma fila que criamos.\n\n![Esquema de topic em filas](https://www.rabbitmq.com/img/tutorials/python-five.png)\n\nVamos utilziar o Hermes para declarar uma fila e fazer um bind.\n\n```php\n\u003c?php\n\n$queueName = $hermes-\u003eaddQueue(\n        'queue_name', // Se for uma string vazia, irá criar um nome aleatório\n        true, // Ativa o nack e cria uma fila adicional chamada queue_name.nack, o paramêtro é opcional e o default é a fila ativa\n        true // Parâmetro opcional de fila durável ou não, o padrão é durável\n    )\n        -\u003ebind(\n            'my.routing.key',\n            null, // Parâmetro opcional de nome da fila, se for null, irá pegar o nome da última fila criada\n            'custom_exchange'; // Parâmetro opcional exchange, se não for passado, irá pegar a exchange default 'eduzz'\n        )\n        -\u003egetLastQueueCreated(); // Retorna o nome da última fila criada\n\n```\n\n### Consumindo uma fila\n\nPara consumir uma fila, precisamos adicionar um callback a uma fila que criamos, e então, chamar o start do Hermes que vai dar ínicio ao processamento da fila.\n\n```php\n\u003c?php\n\n$hermes-\u003eaddListenerTo(\n    'queue_name',\n    function($msg) {\n        echo json_encode($msg-\u003ebody);\n    },\n    true // Ativa ou não a opção de errorHandling do Hermes\n);\n\n$hermes-\u003estart();\n```\n\nCaso o errorHandling do Hermes esteja ativo, é necessário que a fila conectada possua o nack ativado, as exceções não capturadas dentro do callback serão tratadas e o conteúdo da mensagem será enviado para a fila de nack.\n\nCaso o nack esteja ativado e o errorHandling esteja desativado, é necessário, dentro do seu callback, utilizar os métodos ack e nack, exemplo:\n\n```php\n\u003c?php\n\n$hermes-\u003eaddListenerTo(\n\t'queue_name',\n\tfunction($msg) use ($hermes) {\n\t\ttry {\n\t\t\techo json_encode($msg-\u003ebody);\n\n\t\t\treturn $hermes-\u003econsumer()-\u003eack($msg);\n\t\t catch(\\Exception $e) {\n\t\t\treturn $hermes-\u003econsumer()-\u003enack($msg);\n\t\t}\n\t},\n\tfalse // Error handling desativado\n);\n\n$hermes-\u003estart();\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feduzz%2Fhermes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feduzz%2Fhermes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feduzz%2Fhermes/lists"}