jc-it/yii2-job-queue

作业队列实现。

v2.0.2 2022-08-16 11:31 UTC

This package is auto-updated.

Last update: 2024-09-16 16:12:43 UTC


README

Scrutinizer Code Quality Code Coverage Build Status

此扩展提供了一个实现队列、工作进程和作业的包。

$ composer require jc-it/yii2-job-queue

或者添加

"jc-it/yii2-job-queue": "<latest version>"

到您的 composer.json 文件的 require 部分。

配置

  • 您需要安装 Beanstalk(《sudo apt install beanstalkd》)
  • 应用配置
'container' => [
    'definitions' => [
        \League\Tactician\CommandBus::class => function(\yii\di\Container $container) {
            return new \League\Tactician\CommandBus([
                new \League\Tactician\Handler\CommandHandlerMiddleware (
                    $container->get(\League\Tactician\Handler\CommandNameExtractor\CommandNameExtractor::class),
                    $container->get(\League\Tactician\Handler\Locator\HandlerLocator::class),
                    $container->get(\League\Tactician\Handler\MethodNameInflector\MethodNameInflector::class)
                )
            ]);
        },
        \JCIT\jobqueue\components\ContainerMapLocator::class => function(\yii\di\Container $container) {
            $result = new \JCIT\jobqueue\components\ContainerMapLocator($container);
            // Register handlers here
            // i.e. $result->setHandlerForCommand(\JCIT\jobqueue\jobs\HelloJob::class, \JCIT\jobqueue\jobHandlers\HelloHandler::class);
            return $result;
        },
        \League\Tactician\Handler\CommandNameExtractor\CommandNameExtractor::class => \League\Tactician\Handler\CommandNameExtractor\ClassNameExtractor::class,
        \League\Tactician\Handler\Locator\HandlerLocator::class => \JCIT\jobqueue\components\ContainerMapLocator::class,
        \JCIT\jobqueue\interfaces\JobFactoryInterface::class => \JCIT\jobqueue\factories\JobFactory::class,
        \JCIT\jobqueue\interfaces\JobQueueInterface::class => \JCIT\jobqueue\components\Beanstalk::class,
        \League\Tactician\Handler\MethodNameInflector\MethodNameInflector::class => \League\Tactician\Handler\MethodNameInflector\HandleInflector::class,
        \Pheanstalk\Contract\PheanstalkInterface::class => \JCIT\jobqueue\components\Beanstalk::class,
        \Pheanstalk\Contract\SocketFactoryInterface::class => function() {
            return new \Pheanstalk\SocketFactory('localhost', 11300, 10);
        },
    ]
],
  • 在控制器中注册守护进程操作
public function actions(): array
{
    return [
        'daemon' => \JCIT\jobqueue\actions\DaemonAction::class,
    ];
}
  • 运行操作,例如 ./yii job-queue/daemon

可选:将守护进程安装为服务

在此处查看示例,了解如何将控制台操作安装为 Linux 服务:https://yiiframework.cn/extension/yiisoft/yii2-queue/doc/guide/2.0/en/worker

快速测试

  • 执行配置中的步骤
  • ContainerMapLocator 中注册 \JCIT\jobqueue\jobs\HelloJob::class\JCIT\jobqueue\jobHandlers\HelloHandler::class(如配置中所示)
  • 创建 JobQueueController 控制台控制器
class JobQueueController extends \yii\console\Controller
{
    public $defaultAction = 'daemon';

    public function actionTest(
        \JCIT\jobqueue\interfaces\JobQueueInterface $jobQueue
    ) {
        $task = \Yii::createObject(\JCIT\jobqueue\jobs\HelloJob::class, ['world']);
        $jobQueue->putJob($task);
    }

    /**
     * @return array
     */
    public function actions(): array
    {
        return [
            'daemon' => [
                'class' => \JCIT\jobqueue\actions\DaemonAction::class,
            ]
        ];
    }
}
  • 在一个控制台中运行 src/yii job-queue
  • 在第二个控制台中运行 src/yii job-queue/test
  • 运行守护进程的控制台将显示 Hello world
  • 注意 当处理程序更改时,必须重新启动守护进程

自己的实现

  • 创建作业(实现 \JCIT\jobqueue\interfaces\JobInterface::class),它不应执行更多操作,仅携带数据
  • 创建作业处理程序(实现 \JCIT\jobqueue\interfaces\JobHandlerInterface::class),它处理作业的处理
    • 在处理程序的构造中执行注入

日志记录

要使用简单的 ActiveRecord 日志记录作业进行扩展,请参阅 https://packagist.org.cn/packages/jc-it/yii2-job-queue-logging

重复作业

要使用基于 ActiveRecord 的简单重复作业进行扩展,请参阅 https://packagist.org.cn/packages/jc-it/yii2-job-queue-recurring

致谢