creode/magento2-messagequeue

dev-master 2017-11-14 10:19 UTC

This package is auto-updated.

Last update: 2024-09-27 21:53:08 UTC


README

一个简单的系统,用于在 Magento 2 中传递和处理消息。

包含在正常站点使用期间排队消息的类,以及在 cron 任务中处理队列的类

只有一个队列,但可以使用 setGroup() 方法对消息进行分组。

使用方法

向队列添加消息

# inject a queue factory into your constructor
public function __construct(
    \Creode\MessageQueue\Model\MessagequeueFactory $messageQueueFactory
) {
    $this->messageQueueFactory = $messageQueueFactory;
}

function createAMessage() {
    $message = $this->messageQueueFactory->create();

    # create messages with waiting status so they'll be picked up when processing the queue
    $message->setStatus(\Creode\MessageQueue\Model\Messagequeue::STATUS_WAITING)
        ->setMessage('a message for Creodes group')
        ->setGroup(\Your\Module\Cron\ProcessCreodesGroup::MESSAGE_GROUP) # it's recommended to use the class constant for message group
        ->setCreationTime(time())
        ->save();
}

在 cron 任务中处理消息

Your/Module/etc/crontab.xml

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
    <group id="message-queue-processing">
        <job instance="Your\Module\Cron\ProcessCreodesGroup" method="execute" name="creode_processqueue_creodesgroup">
            <schedule>*/5 * * * *</schedule>
        </job>
    </group>
</config>

Your/Module/Cron/ProcessCreodesGroup.php

当扩展 Creode\MessageQueue\Cron\ProcessQueue 时,你的 cron 作业类只需要一个方法 - processMessage

被选中的消息状态为 等待

当作业获取消息时,消息将自动标记为 处理中。进一步的运行将不会获取已经正在处理的消息。

如果 processMessage 方法无错误完成,消息将被标记为 完成

如果在 processMessage 中抛出异常,消息处理将被中止,并将消息添加回队列,将其状态设置为 等待

消息最多可以失败 5 次,此时它们将被标记为 失败,并且在未来的运行中不会被处理。

<?php

namespace Your\Module\Cron;

use Creode\MessageQueue\Cron\ProcessQueue;
use Creode\MessageQueue\Model\Messagequeue as Message;

class ProcessCreodesGroup extends ProcessQueue
{
    const MESSAGE_GROUP = 'creodes_group';

    /**
     * @inheritdoc
     */
    protected function processMessage(Message $message)
    {
        # write your code here to do _the thing_ you need the queue for

        # log the message
        $this->logger->debug('Processing Creodes Group message with contents ' . $message->getMessage());

        # your message could be an order id, customer id etc. and you can load the object
        # by injecting a repository into the constructor (but don't forget to call parent::__construct()!)
        # or it could be a json encoded object... anything you like
    }
}

清理

模块包含一个 cron 作业,用于清理任何在过去 2 个月内未创建或更新的消息。

如果您想更改清理标准,覆盖 Creode\MessageQueue\Cron\CleanQueue 类并调整 cleanupMessages 方法。如果您只想覆盖阈值,则可以保留 cleanupMessages 方法不变,并简单地覆盖 DATE_THRESHOLD 类常量。