daanbiesterbos/job-queue-bundle

允许运行和安排 Symfony 控制台命令作为后台作业。

安装次数: 19,736

依赖者: 0

建议者: 0

安全: 0

星标: 2

关注者: 1

分支: 255

类型:symfony-bundle

2.2.0 2021-04-19 12:02 UTC

README

Build Latest Stable Version Total Downloads

安装

composer require daanbiesterbos/job-queue-bundle

注册 Bundle

将 Bundle 添加到 bundles.php

JMS\JobQueueBundle\JMSJobQueueBundle::class => ['all' => true],

准备控制台可执行文件

bin/console 复制到 bin/job-queue 并使用 JMSJobQueueBundle 应用程序代替标准的 Symfony 应用程序。

#
# Copy the console executable
#

cp bin/console bin/job-queue

#
# Open bin/job-queue in a text editor
#
# Look for this line:
# use Symfony\Bundle\FrameworkBundle\Console\Application;
#
# And change it to:
# use JMS\JobQueueBundle\Console\Application;

vim bin/job-queue

注意:这是原始 Bundle 的一部分。我更希望有一个不需要额外控制台的更好解决方案。然而,考虑到分支的目的,当前更注重向后兼容性。

用法

创建作业

创建作业很简单,只需持久化 Job 实例即可。

    $em->persist($job);
    $em->flush($job);

在作业之间添加依赖关系

如果您希望某个作业在另一个作业完成后运行,也可以轻松实现这一点。

    $job->addDependency($job);
    $em->persist($job);
    $em->persist($dependentJob);
    $em->flush();

安排作业

如果您想安排一个作业

    $job->add(new DateInterval('PT30M'));
    $job->setExecuteAfter($date);
    $em->persist($job);
    $em->flush();

通过队列实现细粒度并发控制

如果您想更好地控制特定作业类型的并发性,可以使用队列:队列允许您强制更严格的限制,限制每个队列中运行的作业数量。默认情况下,每个队列中作业的数量没有限制,因此此类队列将没有效果(作业将按照创建的顺序处理)。要为队列定义限制,可以使用 Bundle 的配置。

    jms_job_queue:
        queue_options_defaults:
            max_concurrent_jobs: 3 # This limit applies to all queues (including the default queue).
                                   # So each queue may only process 3 jobs simultaneously.
        queue_options:
            foo:
                max_concurrent_jobs: 2 # This limit applies only to the "foo" queue.

**注意**:队列设置适用于每个 jms-job-queue:run 命令的单独实例。无法指定所有实例的全局限制。

优先级作业

默认情况下,所有作业都按它们安排的顺序执行(假设它们在同一个队列中)。如果您想在同一队列中优先执行某些作业,可以设置优先级。

$job = new Job('a', array(), true, Job::DEFAULT_QUEUE, Job::PRIORITY_HIGH);
$em->persist($job);
$em->flush();

优先级是一个简单的整数 - 数值越高,作业执行得越早。

安排的作业 - JMSJobQueueBundle 文档

此 Bundle 还允许您有安排的作业,它们在特定的时间间隔内执行。这可以通过在您的命令中实现 JMSJobQueueBundleCommandCronCommand 或在服务中实现 JMSJobQueueBundleCronJobScheduler 并使用 jms_job_queue.scheduler 标签来实现。作业随后通过作为额外后台进程运行的 jms-job-queue:schedule 命令进行安排。您还可以运行多个此命令的实例,以确保高可用性并避免单点故障。

实现 CronCommand

    class MyScheduledCommand extends Command implements CronCommand
    {
        // configure, execute, etc. ...
    
        public function shouldBeScheduled(DateTime $lastRunAt)
        {
            return time() - $lastRunAt->getTimestamp() >= 60; // Executed at most every minute.
        }
    
        public function createCronJob(DateTime $lastRunAt)
        {
            return new Job('my-scheduled-command');
        }
    }

对于常见的间隔,您还可以使用提供的特性之一。

    class MyScheduledCommand extends ContainerAwareCommand implements CronCommand
    {
        use ScheduleEveryMinute;
    
        // ...
    }

实现 JobScheduler

如果您想通过此 Bundle 将第三方命令或 Symfony 命令作为安排的命令运行,这很有用。

    class MyJobScheduler implements JobScheduler
    {
        public function getCommands(): array
        {
            return ['my-command'];
        }
    
        public function shouldSchedule($commandName, DateTime $lastRunAt)
        {
            return time() - $lastRunAt->getTimestamp() >= 60; // Executed at most every minute.
        }
    
        public function createJob($commandName, DateTime $lastRunAt)
        {
            return new Job('my-command');
        }
    }

链接