Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php RabbitMq:替换重复的消息_Php_Rabbitmq_Amqp_Php Amqplib - Fatal编程技术网

Php RabbitMq:替换重复的消息

Php RabbitMq:替换重复的消息,php,rabbitmq,amqp,php-amqplib,Php,Rabbitmq,Amqp,Php Amqplib,我正在使用RabbitMq为注册的web挂钩提交数据 基本信息: 如果在系统中创建了联系人,则消息将放入队列中,并且消费者稍后将钩子数据发送到注册的url 对我的问题: 一个联系人可能在5秒内更新两次,并且两条消息仍在队列中。 但我希望,如果第二条消息排队,第一条消息将被删除 我知道我不能手动删除邮件。但是,是否有可能在消息上设置一个id,并且如果具有相同id的两条消息位于同一队列中,则第一条消息会自动删除/替换? 只有一个请求被发送到url。我知道您可以在消息本身上设置消息id。但是我找不到任

我正在使用RabbitMq为注册的web挂钩提交数据

基本信息: 如果在系统中创建了联系人,则消息将放入队列中,并且消费者稍后将钩子数据发送到注册的url

对我的问题: 一个联系人可能在5秒内更新两次,并且两条消息仍在队列中。 但我希望,如果第二条消息排队,第一条消息将被删除

我知道我不能手动删除邮件。但是,是否有可能在消息上设置一个id,并且如果具有相同id的两条消息位于同一队列中,则第一条消息会自动删除/替换? 只有一个请求被发送到url。我知道您可以在消息本身上设置消息id。但是我找不到任何东西来代替旧的

我的PHP代码(简化):

顺便说一句,我正在使用php amqplib

谢谢你的帮助
Flo

RabbitMQ不会以这种方式删除/过滤消息。您必须在应用程序级别执行此操作,可能需要使用类似bloom筛选器的东西。

您可以使用唯一的消息ID标记每条消息。消费应用程序应该保留一个已处理的入站消息ID的优化列表(在线程安全的
HashMap
Java),或
字典
.NET)实现


如果收到一封已经处理过的邮件(邮件ID位于已处理邮件ID的存储列表中),它将被忽略(或者应该发出礼貌的“请等待”式响应),保留幂等性。

我是这么想的。但我不确定。感谢您的帮助
    $connection = new AMQPConnection('localhost', 5672, 'test', 'test');
    $channel = $connection->channel();
    $channel->queue_declare(self::QUEUE_NAME, false, true, false, false);

    $data = array(
        'model' => get_class($subject),
        'id' => $subject->getId(),
        'event' => $event->getName()
    );
    $messageProperties = array(
        'message_id' => get_class($subject) . '-' . $subject->getId()
    );
    $channel->basic_publish(new AMQPMessage(json_encode($data), $messageProperties), '', self::QUEUE_NAME);

    $channel->close();
    $connection->close();