oat-sa/extension-tao-scheduler

TAO作业调度器

安装次数: 18,915

依赖项: 1

建议者: 0

安全: 0

星级: 1

关注者: 48

分支: 0

开放问题: 1

类型: tao-extension


README

使用RRULE标准来配置每个作业的时间和重复规则。

安装

$ composer require oat-sa/extension-tao-scheduler

使用方法

附加作业

use oat\taoScheduler\model\scheduler\SchedulerServiceInterface;
$schedulerService = $this->getServiceManager()->get(SchedulerServiceInterface::SERVICE_ID);
$schedulerService->attach(
    'FREQ=MONTHLY;COUNT=5',                     //Reccurrence rule (repeat monthly, 5 times)  
    new \DateTime('2017-12-12 20:00:00'),       //Start date (time of first execution) 
    ['taoExtension/ServiceName', 'methodName']  //Callback to be called.
);

也可以使用cron表示法

$schedulerService->attach(
    '* * * * *',                                //Reccurrence rule (repeat minutely)  
    new \DateTime('2017-12-12 20:00:00'),       //Start date (time of first execution) 
    ['taoExtension/ServiceName', 'methodName']  //Callback to be called.
);

注意:

除了函数外,您可以使用任何可调用类型的实例作为回调。如果使用对象([$object, 'method')),请确保对象是PhpSerializable的实例。
可以使用oat\oatbox\action\Action实例的类名作为回调

分离作业

use oat\taoScheduler\model\scheduler\SchedulerServiceInterface;
$schedulerService = $this->getServiceManager()->get(SchedulerServiceInterface::SERVICE_ID);
$schedulerService->detach(
    'FREQ=MONTHLY;COUNT=5',                     //Reccurrence rule (repeat monthly, 5 times)  
    new \DateTime('2017-12-12 20:00:00'),       //Start date (time of first execution) 
    ['taoExtension/ServiceName', 'methodName']  //Callback to be called.
);

传递给detach函数的所有参数应与现有作业中的参数相同。

运行JobRunner

sudo -u www-data php index.php '\oat\taoScheduler\scripts\JobRunner' 1518006301 PT10S
  • 第一个参数是调度器应该开始查找计划任务的日期戳。在此时间之前的所有任务都将被忽略。

注意:

即使计划任务的开始日期晚于提供给作业运行器的日期,任务也可能被执行,因为它们可能是重复的,而开始日期只是第一次发生的时间。

如果省略此参数或小于0,则从存储中获取起始时间(最后查找计划作业的时间或最后作业运行器迭代的时间)。
如果没有最后迭代时间在存储中,则使用当前时间戳。

  • 第二个参数是作业运行器迭代之间的时间。默认值为60秒。此时间可能比配置的更长,因为找到的任务的执行可能需要一些时间。

发现要运行的任务

sudo -u www-data php index.php '\oat\taoScheduler\scripts\tools\SchedulerHelper' show 1518097355 1518100955 

从作业存储中删除过期的作业(在给定日期之后不再执行的作业)

sudo php index.php '\oat\taoScheduler\scripts\tools\SchedulerHelper' removeExpiredJobs false 1519890884 
  • 第一个参数是dryrun模式。默认值为false
  • 第二个参数是辅助程序将尝试找到过期作业的时间(包括给定时间)。如果未提供参数,则使用作业运行器的最后启动时间。

要使用任务队列运行任务,您可以使用\oat\taoTaskQueue\scripts\tools\AddTaskToQueue操作。

注意:

taoScheduler不需要taoTaskQueue扩展。请确保已安装任务队列。

use oat\taoTaskQueue\scripts\tools\AddTaskToQueue;
$schedulerService->attach(
    '*/5 * * * *',
    new DateTime('now', new \DateTimeZone('utc')),
    AddTaskToQueue::class,
    [ActionClassToBeRun::class, 'param 1', 'param2']
);

警告

  1. 如果调度器将在多服务器环境中运行,请使用常见的rds存储配置JobRunner服务。
  2. 请勿安排执行需要大量资源或耗时较长的任务。所有消耗时间/资源的任务应在任务队列中创建适当的任务。理想情况下,计划任务应该除了向任务队列添加任务外不做任何事情。
  3. 如果发生次数不受限制,请使用cron语法。
  4. iCalendar语法更灵活,但在重复次数较多或无限的情况下,可能会出现性能问题。默认重复次数限制为732。更多信息:https://github.com/simshaun/recurr