自定义进程

    在任意位置实现一个继承 的子类,并实现接口方法 handle(): void,方法内实现您的逻辑代码,我们通过代码来举例:

    这样即完成了一个自定义进程类,但该自定义进程类尚未被注册到 进程管理器(ProcessManager) 内,我们可以通过 配置文件注解 两种方式的任意一种来完成注册工作。

    1. // config/autoload/processes.php
    2. return [
    3. \App\Process\FooProcess::class,
    4. ];

    通过注解注册

    只需在自定义进程类上定义 @Process 注解,Hyperf 会收集并自动完成注册工作:

    1. <?php
    2. declare(strict_types=1);
    3. namespace App\Process;
    4. use Hyperf\Process\AbstractProcess;
    5. use Hyperf\Process\Annotation\Process;
    6. /**
    7. * @Process(name="foo_process")
    8. class FooProcess extends AbstractProcess
    9. {
    10. public function handle(): void
    11. {
    12. // 您的代码 ...
    13. }
    14. public function isEnable(): bool
    15. {
    16. // 不跟随服务启动一同启动
    17. return false;
    18. }
    19. }

    自定义进程存在一些可设置的参数,均可以通过 在子类上重写参数对应的属性 或 在 @Process 注解内定义对应的属性 两种方式来进行定义。

    我们创建一个用于监控失败队列数量的子进程,当失败队列有数据时,报出警告。

    1. <?php
    2. declare(strict_types=1);
    3. namespace App\Process;
    4. use Hyperf\Process\Annotation\Process;
    5. /**
    6. * @Process(name="demo_process")
    7. */
    8. class DemoProcess extends AbstractProcess
    9. {
    10. public function handle(): void
    11. {
    12. $logger = $this->container->get(StdoutLoggerInterface::class);
    13. while (true) {
    14. $redis = $this->container->get(\Redis::class);
    15. $count = $redis->llen('queue:failed');
    16. if ($count > 0) {
    17. $logger->warning('The num of failed queue is ' . $count);
    18. }
    19. sleep(1);
    20. }
    21. }