webman如何使用stomp队列插件操作rabbimq

ysian

问题描述

1.首先在rabbmitmq增加一个名为demo的交换机
截图
2.然后增加一个名为demo_test的队列
截图
3.队列与交换机绑定,路由键随便写的,与队列名一样
截图
4.webman安装
composer require teamones/stomp-queue

5.在config增加stomp配置
截图
6.投递消息
截图
7.消费位置
截图
8.
截图

改了端口之后:
截图
按照destination增加了名为default.demo的交换机和名为default.demo_test的队列,然后俩者根据
路由键default.demo_test进行了绑定
截图
截图

问题:这一顿操作下来,消息是投递成功了,但是消费者没有触发,请问是queue/stomp/demo.php的代码有问题,还是触发消费者还需要其他的一些操作,亦或者我手动创建的交换机,队列,路由这一环节有问题?

473 4 0
4个回答

latin

rabbitmq 应该要安装stomp插件才能用stomp,具体百度下 rabbitmq stomp

  • ysian 2022-11-27

    我这边是已经开启的,rabbitmq-plugins enable rabbitmq_stomp; 不知道是不是流程上的错误,还是代码投递的问题或者是配置上写错了; 网上搜了下,几乎没有关于webman使用stomp操作rabbmit的的话题

抽不完的寂寞
  • ysian 2022-11-27

    改了端口能够投递消息了,但是消费者没有触发; 请问是queue/stomp/demo.php的示例不对吗?还是说触发消费者还需要其它的一些流程

抽不完的寂寞

我弄了个新的ubuntu服务器试了下,很顺利就通了
1、安装rabbitmq-server,apt-get install rabbitmq-server
2、启用stomp,rabbitmq-plugins enable rabbitmq_stomp
3、按照手册安装webman/stompcomposer require webman/stomp
4、按照手册新建控制器投递消息

<?php
namespace app\controller;

use support\Request;
use Webman\Stomp\Client;

class Index
{
    public function queue(Request $request)
    {
        // 队列
        $queue = 'examples';
        // 数据(传递数组时需要自行序列化,比如使用json_encode,serialize等)
        $data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
        // 执行投递
        Client::send($queue, $data);

        return response('redis queue test');
    }

}

5、按照手册新建消费者消费消息

<?php
namespace app\queue\stomp;

use Workerman\Stomp\AckResolver;
use Webman\Stomp\Consumer;

class MyMailSend implements Consumer
{
    // 队列名
    public $queue = 'examples';

    // 连接名,对应 stomp.php 里的连接`
    public $connection = 'default';

    // 值为 client 时需要调用$ack_resolver->ack()告诉服务端已经成功消费
    // 值为 auto   时无需调用$ack_resolver->ack()
    public $ack = 'auto';

    // 消费
    public function consume($data, AckResolver $ack_resolver = null)
    {
        // 如果是数据是数组,需要自行反序列化
        var_export(json_decode($data, true)); // 输出 ['to' => 'tom@gmail.com', 'content' => 'hello']
        // 告诉服务端,已经成功消费
        $ack_resolver->ack(); // ack为 auto时可以省略此调用
    }
}

6、启动workerman

7、访问控制器http://127.0.0.1:8787/index/queue

8、终端显示消费成功
截图

以上rabbitmq除了apt-get install rabbitmq-server rabbitmq-plugins enable rabbitmq_stomp 2句命令,什么都没设置,代码完全照抄手册,一次成功

  • ysian 2022-11-27

    你能配置一下延时队列吗? 我刚开始就没走普通的队列;

  • ysian 2022-11-27

    https://www.workerman.net/q/9746, 这边是我走延时队列的流程,走了一天,没有跑通,不知道该怎样调用消费者去消费

  • 抽不完的寂寞 2022-11-27

    接着上面的步骤,增加了如下操作
    1、下载组件 rabbitmq_delayed_message_exchange/usr/lib/rabbitmq/lib/rabbitmq_server-3.8.2/plugins (我本地目录是这个,各个系统可能不一样)
    2、执行 rabbitmq-plugins enable rabbitmq_delayed_message_exchange
    3、按照手册安装 composer require teamones/stomp-queue
    4、重启rabbitmq和webman
    5、访问 http://127.0.0.1:8787/index/queue 得到如下结果
    截图

    可能是 teamones/stomp-queue 自带什么设置,和前面的截图比较调试信息没了,但是确实消费了

  • ysian 2022-11-27

    能让我看下你stomp.php是怎样配置的吗?你把密码去掉; 另外需要添加交换机和队列吗?

  • 抽不完的寂寞 2022-11-27

    就是手册的配置
    截图
    config/stomp.php

    截图
    config/plugin/webman/stomp/stomp.php

    有2个配置配置文件,我不清楚哪个配置是生效的。config/plugin/webman/stomp/stomp.php是自动生成的,config/stomp.php是执行完composer require teamones/stomp-queue后按照手册加的。

    rabbitmq只执行过rabbitmq-plugins enable rabbitmq_stomp rabbitmq-plugins enable rabbitmq_delayed_message_exchange 没有做过其他配置

  • ysian 2022-11-27

    你的Client::send($queue, $data,10); 后面加上秒数了吗? 没加的话走的是第一种,加上的话会报错

  • walkor 2022-11-28

    teamones/stomp-queue 是第三方的,文档可能过期了,文档先暂时隐藏。

    rabbitmq延迟队列服务端设置参考文档 https://blog.rabbitmq.com/posts/2015/04/scheduling-messages-with-rabbitmq
    按照文档,延迟时间可以通过header传递,

    Client::send($queue, $data, ['x-delay' => 10*1000]);
  • ysian 2022-11-28

    这个stomp总感觉有点不稳定,可能是我不会使用的原因;

ysian

截图
stomp插件有时候会丢失消息,如图所示,生产了,确没有消费, 还有一个问题,重启rabbitmq后,所有的消息都会丢失,没有持久化,不知道什么原因

  • walkor 2022-11-28

    这个很多人在用了,没有反馈过丢消息问题。
    有可能是服务端设置问题,比如消息重复就保留一条。
    关于rabbitmq持久化需要看下rabbitmq文档,设置成持久化存储

  • chaz6chez 2022-11-29

    stomp主要用于websocket的发布订阅,并不是一个完整的消费协议,不保证消息的到达率,stomp的初衷是为了实现C/S的发布订阅模型,而不是用于消费队列的实现,如果使用场景是消费队列场景,请使用标准AMQP协议!

🔝