masnun / joinjobs

此包最新版本(dev-master)没有提供许可证信息。

一个Laravel包,允许在作业完成或队列耗尽时调度某些操作。

dev-master 2014-11-25 20:42 UTC

This package is not auto-updated.

Last update: 2024-09-24 03:49:14 UTC


README

一个Laravel包,允许在作业完成或队列耗尽时调度某些操作。

此包允许您注册一个类或闭包,当单个作业完成时执行。您也可以在一系列作业中的每个作业都运行完毕时注册一个类或闭包。

该包由Pure SEO的善良人士赞助。

安装

此包来自Packagist composer仓库。将这些添加到您的composer.json文件中,并运行composer install

"masnun/joinjobs": "dev-master"

注册服务提供者

安装包后,您需要注册服务提供者。打开app/config/app.php并将Masnun\Joinjobs\JoinjobsServiceProvider添加到providers数组中。

其他相关配置

  • 请确保Laravel有一个正确配置的活跃数据库连接。
  • 要测试队列,您需要正确配置Laravel队列。使用异步队列可以获得最佳效果。

请参阅Laravel文档的相关部分以正确设置它们。

运行迁移

此包使用某些数据库表来跟踪作业和队列。我们需要在包上运行迁移以确保数据库模式正确创建。

php artisan migrate --package=masnun/joinjobs

使用API

过程很简单

  • 创建一个新的连接,传入一个处理器。选择它是否应该自动删除。处理器可以是一个闭包或具有run()方法的完全限定类名。第二个参数用于自动删除。

  • 我们将作业添加到连接中。每个作业都可以带有一个可选的闭包/类来执行。

  • 我们必须让系统知道所有作业都已分发。我们可以将可选的第三个参数作为true传递给作业,将其标记为最后一个作业。或者,我们可以调用JoinJobsManager上的setFullyDispatched($joinId)方法。

    例如:$joinjobsManager->setFullyDispatched($joinId)

    这是使用sync驱动程序时确保我们的JoinHandler在所有作业分发之前不执行的要求。

创建一个新的连接并添加作业到其中

 	 
 	 // Create a new manager
    $joinjobsManager = new JoinJobsManager();

    // We create a new join, set auto deletion to true
    $joinId = $joinjobsManager->createJoin(null, true);
    
    $joinjobsManager->addHandlerToJoin($joinId, function() {
            echo "The Join successfully completed!";
    });

    // addJob()
    $jobId = $joinjobsManager->addJob($joinId);


    Queue::push('DemoJob', ['jobId' => $jobId, 'sleepDuration' => 5]);

    $joinjobsManager->addHandlerToJob($jobId, function() use($jobId) {
            echo "Completed Job ID: {$jobId}";
    });

	// This job is the last one, we are not adding any more jobs
    $jobId = $joinjobsManager->addJob($joinId, "\\Masnun\\Joinjobs\\JoinHandler", true);
    Queue::push('DemoJob', ['jobId' => $jobId, 'sleepDuration' => 10]);

    return "Added two jobs!";

标记作业完成

一旦作业完成,我们必须让我们的JoinJobsManager知道有一个作业已经完成执行。以下是一个示例DemoJob

class DemoJob
{
    public function fire($job, $data)
    {
        // We could put this in the DI containter 
        // if we use this a lot
        $joinjobsManager = new JoinJobsManager();

        $jobId = $data['jobId'];
        $sleepDuration = $data['sleepDuration'];
        
        sleep($sleepDuration);

        // Mark the job as complete
        $joinjobsManager->completeJob($jobId);

		// Remove the job from Queue
        $job->delete();
    }
}

自动删除

createJoin()方法接受一个可选的第二个参数。如果我们将其设置为true,则连接及其相关的所有作业将被删除。

手动删除

$joinjobsManager->deleteJoin($joinId);

这将删除连接及其所属的所有作业。