tavii/sqs-job-queue-bundle

0.2.6 2017-10-16 13:37 UTC

This package is auto-updated.

Last update: 2024-09-18 04:30:20 UTC


README

Build Status Coverage Status Scrutinizer Code Quality Latest Stable Version Total Downloads Latest Unstable Version License

这是一个用于处理Amazon SQS的bundle,旨在使用Symfony2处理队列。
创建这个bundle的背景是,类似于BCCResqueBundle,目的是使用Job进行数据处理。

要求

  • PHP5.6+
  • Symfony2.7+

安装

1: 执行composer install

$ composer require tavii/sqs-job-queue-bundle:0.0.3

2: 在AppKernel中注册SQSJobQueueBundle

<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...

            new Tavii\SQSJobQueueBunblde\SQSJobQueueBundle()
        );

        // ...
    }

    // ...
}

3: 在config.yml中添加设置

tavii_sqs_job_queue:
    aws:
        key: %aws_api_key%
        secret: %aws_api_secret%
        region: %aws_api_region%

使用

1: 设置数据库表

为将工作者信息记录到数据库,创建一个表。
目前,会创建一个名为`sqs_workers`的表。

$ app/console sqs_job_queue:storage-init

2: 在Amazon SQS中注册队列

在Amazon SQS侧注册队列。
您也可以从AWS的管理界面创建,但我们也提供了命令。这次我们将注册一个名为`test`的队列。

$ app/console sqs_job_queue:queue-create test

3: 创建Job类

创建一个负责处理工作的Job类。
这次我们将创建一个发送邮件的Job类。

创建一个继承自Tavii\SQSJobQueue\Job类或Tavii\SQSJobQueueBundle\ContainerAwareJob类的类。
这两个类的区别在于是否可以使用DI容器。
使用Tavii\SQSJobQueueBundle\ContainerAwareJob可以启用DI容器。

请确保在处理成功的情况下返回true

<?php
// src/AppBundle/Job/SendMailJob.php

namespace AppBundle\Job;


use Tavii\SQSJobQueueBundle\ContainerAwareJob;

class SendMailJob extends ContainerAwareJob
{

    public function getName()
    {
        return 'test'; // ここをキュー名と一致させること
    }

    public function run()
    {
        $message = \Swift_Message::newInstance()
            ->setFrom('hoge@fuga.com')
            ->setTo('fuga@hoge.com')
            ->setSubject('job test')
            ->setBody('job mail test');

        $mailer = $this->getContainer()->get('mailer');
        $ret = $mailer->send($message);
        return true;
    }
}

4: 将Job注册到队列

从Job的实例中,将其注册到队列。

<?php
...

$job = new TestJob();
$this->getContainer()->get('sqs_job_queue.queue')->push($job);

5: 执行工作者

要执行工作者,请执行sqs_job_queue:worker-run

$ app/console sqs_job_queue:worker-run test

6: 常驻工作者

要常驻工作者,请执行sqs_job_queue:worker-start

$ app/console sqs_job_queue:worker-start test

7: 停止工作者

要停止常驻工作者,请执行sqs_job_queue:worker-stop

$ app/console sqs_job_queue:worker-start test

事件调度器

我们触发了一些事件。

SQSJobQueueEvents::QUEUE_RECEIVED

在从SQS接收队列时发生事件。

SQSJobQueueEvents::QUEUE_SENT

在SQS接收队列时发生事件。

SQSJobQueueEvents::QUEUE_DELETED

在SQS的队列被删除时发生事件。

SQSJobQueueEvents::JOB_EXECUTE

在Job执行时发生事件。

SQSJobQueueEvents::JOB_RAN

在Job执行完成后发生事件。

待办事项

  • 解决只能使用Doctrine进行存储的问题
  • 提供管理界面