beat/rabbitmq-tools 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

beat/rabbitmq-tools

Composer 安装命令:

composer require beat/rabbitmq-tools

包简介

Server/Client management for rabbitmq.

README 文档

README

Repositorio con utilidades mínimas para trabajar con RabbitMQ: clientes (RPC y topic) y servidores que consumen RPC y mensajes topic.

Este README explica cómo usar el código, cómo extender las clases base y cómo probar el proyecto usando los scripts de ejemplo incluidos en tests/Scripts/.

Contenido relevante del repositorio

  • src/ — implementaciones principales:
    • Core/RabbitMQClient.php — clase base para clientes (RPC + topic).
    • Core/RabbitMQServer.php — clase base para servidores (RPC + topic).
    • Interfaces/RPCActionHandler.php — contrato para handlers RPC.
    • Traits/RabbitmqToolsUtilsTrait.php — helpers útiles (p. ej. response).
  • tests/ — ejemplos y clases de prueba:
    • TestClient.php, TestServer.php, TestActionHandler.php — ejemplos de cliente/servidor/handler.
  • tests/Scripts/ — scripts de ejemplo:
    • start_server.php — arranca TestServer.
    • rpc_client.php — cliente RPC de ejemplo.
    • topic_client.php — cliente topic de ejemplo.
  • docker-compose.yaml — incluye un servicio rabbitmq y contenedores php útiles para pruebas locales.

Descripción rápida

Las clases base facilitan:

  • Envío de mensajes a un exchange topic.
  • Realizar llamadas RPC y esperar la respuesta correlacionada.
  • Crear y gestionar colas y bindings necesarios en el servidor.

La idea es que extiendas RabbitMQClient y RabbitMQServer definiendo las colas/exchanges que usas y los handlers RPC (implementando RPCActionHandler).

Requisitos

  • PHP 7.4+ (el proyecto dispone de imágenes Docker para 7.4 y 8.3 en docker-compose.yaml).
  • Composer.
  • Extensión ext-json.
  • RabbitMQ (puedes usar Docker/docker-compose incluido).

Dependencias PHP definidas en composer.json: php-amqplib/php-amqplib.

Instalación

  1. Instala las dependencias con Composer:
composer install
  1. (Opcional) Levanta RabbitMQ con Docker Compose (recomendado para pruebas):
docker-compose up -d rabbitmq

Credenciales por defecto en el compose: user / password.

Si quieres levantar también los contenedores PHP listados en docker-compose.yaml:

docker-compose up -d

Ejemplos de uso

Los scripts de ejemplo usan clases definidas en tests/:

  • TestClient extiende RabbitMQClient y define rpcQueue() y topicExchangeName().
  • TestServer extiende RabbitMQServer, define rpcActionMap() y topicRoutingKeys() y un topicCallback() para imprimir mensajes.
  • TestActionHandler implementa RPCActionHandler y devuelve una respuesta JSON simple.

Parámetros por defecto en los scripts de ejemplo:

  • host: rabbitmq
  • port: 5672
  • user: user
  • password: password
  • vhost: /

Ejecutar los ejemplos localmente (PHP CLI)

  1. Arranca el servidor de ejemplo en una terminal:
php tests/Scripts/start_server.php

Deberías ver algo como:

Listening to RPC action: test-action -> Beat\RabbitmqTools\Tests\TestActionHandler
Listening to topic: #.pokemon
Listening to topic: weekday.*
Listening to topic: beateam.newsletter
  1. En otra terminal, envía una petición RPC:
php tests/Scripts/rpc_client.php test-action "hola"

Salida esperada (ejemplo):

RPC Response:
Array
(
    [message] => Action handled successfully
    [params] => Array
        (
        )

    [body] => Array
        (
            [msg] => hola
        )

)
  1. Publica un mensaje topic:
php tests/Scripts/topic_client.php test.topic.pokemon "mi mensaje"

En la salida del servidor (donde start_server.php corre) verás algo similar a:

Received message on routing key 'test.topic.pokemon': {"message":"mi mensaje"}

Nota importante: los scripts usan por defecto $host = 'rabbitmq'. Esto funciona cuando ejecutas PHP dentro de los contenedores definidos por docker-compose, ya que rabbitmq es el hostname del servicio. Si ejecutas los scripts desde tu máquina local, cambia el host a localhost o la IP donde esté RabbitMQ.

Ejecutar los ejemplos desde Docker (recomendado si no tienes PHP local)

  • Ejecuta el servidor dentro del contenedor PHP 8.3:
docker-compose run --rm php-8.3 php tests/Scripts/start_server.php
  • Ejecuta el cliente RPC dentro del contenedor PHP 8.3:
docker-compose run --rm php-8.3 php tests/Scripts/rpc_client.php test-action "hola"
  • Ejecuta el cliente topic dentro del contenedor PHP 8.3:
docker-compose run --rm php-8.3 php tests/Scripts/topic_client.php test.topic.apples "mi mensaje"

Al usar docker-compose run, el contenedor tiene visibilidad de la red definida en el compose, por eso el hostname rabbitmq resuelve correctamente.

Extender las clases

RabbitMQClient

Debes crear una subclase y definir (al menos) los métodos:

protected function rpcQueue(): ?string;
protected function topicExchangeName(): ?string;
  • rpc(string $action, array $message = [], array $params = [], int $timeout = 30): array — envía una petición RPC y devuelve la respuesta (decodificada).
  • topic(string $routing_key, array $message = []): void — publica un mensaje JSON en el exchange topic.

Si rpcQueue() devuelve null, las funcionalidades RPC no estarán disponibles y la llamada a rpc() lanzará RPCQueueNotDefinedException.

RabbitMQServer

Debes crear una subclase e implementar:

protected function rpcQueue(): ?string;
protected function topicExchangeName(): ?string;
public function rpcActionMap(): array; // action => HandlerClass
public function topicRoutingKeys(): array; // lista de routing keys
protected function topicCallback(string $routing_key, array $message): void;
  • rpcActionMap() debe devolver un array con pares action => HandlerClass. HandlerClass debe implementar Beat\RabbitmqTools\Interfaces\RPCActionHandler.
  • topicRoutingKeys() devuelve los patterns que se bindearán al exchange topic.
  • listen() crea las colas/bindings y comienza a consumir.

Los handlers RPC deben implementar la interfaz:

interface RPCActionHandler
{
    public function handle(array $params, array $body): string;
}

En los tests hay TestActionHandler como ejemplo — usa RabbitmqToolsUtilsTrait::response() para construir respuestas JSON.

Excepciones y errores comunes

  • RPCQueueNotDefinedException — cuando llamas a rpc() y la subclase no definió rpcQueue().
  • TopicExchangeNameNotDefinedException — cuando llamas a topic() y topicExchangeName() no está definida.
  • ServerHasNoQueuesException — lanzada por RabbitMQServer::listen() si la implementación no define ni RPC ni topic.

Además la librería propaga excepciones de php-amqplib para errores de conexión/tiempo de espera.

Pruebas

El repositorio incluye scripts de ejemplo para pruebas manuales (tests/Scripts/). No hay un suite de PHPUnit incluida por defecto.

Pasos rápidos para probar localmente:

  1. composer install
  2. docker-compose up -d rabbitmq (o docker-compose up -d si quieres los contenedores PHP)
  3. Abrir una terminal y ejecutar:
php tests/Scripts/start_server.php
  1. En otra terminal probar los clientes (RPC y topic) como se muestra arriba.

Si quieres, puedo añadir una suite básica de PHPUnit con 2-3 tests (ej. verificar response() del trait y la serialización/deserialización RPC) y un comando composer para ejecutarlos. Dime si lo quieres y lo implemento.

Depuración y UI

  • Management UI (si usas docker-compose): http://localhost:15672 (usuario user, contraseña password).
  • Comprueba que RabbitMQ está corriendo con docker ps o docker-compose ps.
  • Si obtienes errores de conexión, revisa que los valores de host/port/credenciales coincidan con los scripts y con tu entorno.

Contribuir

Si quieres contribuir: crea un fork, agrega tests para el nuevo comportamiento y abre un pull request.

Licencia

LGPL-3.0-or-later (ver composer.json).

beat/rabbitmq-tools 适用场景与选型建议

beat/rabbitmq-tools 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 661 次下载、GitHub Stars 达 0, 最近一次更新时间为 2025 年 10 月 27 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 beat/rabbitmq-tools 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 beat/rabbitmq-tools 我们能提供哪些服务?
定制开发 / 二次开发

基于 beat/rabbitmq-tools 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 661
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 5
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: LGPL-3.0-or-later
  • 更新时间: 2025-10-27