creode / magento2-messagequeue
dev-master
2017-11-14 10:19 UTC
Requires
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
类常量。