自定义进程
在任意位置实现一个继承 的子类,并实现接口方法 handle(): void
,方法内实现您的逻辑代码,我们通过代码来举例:
这样即完成了一个自定义进程类,但该自定义进程类尚未被注册到 进程管理器(ProcessManager)
内,我们可以通过 配置文件
或 注解
两种方式的任意一种来完成注册工作。
// config/autoload/processes.php
return [
\App\Process\FooProcess::class,
];
通过注解注册
只需在自定义进程类上定义 @Process
注解,Hyperf 会收集并自动完成注册工作:
<?php
declare(strict_types=1);
namespace App\Process;
use Hyperf\Process\AbstractProcess;
use Hyperf\Process\Annotation\Process;
/**
* @Process(name="foo_process")
class FooProcess extends AbstractProcess
{
public function handle(): void
{
// 您的代码 ...
}
public function isEnable(): bool
{
// 不跟随服务启动一同启动
return false;
}
}
自定义进程存在一些可设置的参数,均可以通过 在子类上重写参数对应的属性 或 在 @Process
注解内定义对应的属性 两种方式来进行定义。
我们创建一个用于监控失败队列数量的子进程,当失败队列有数据时,报出警告。
<?php
declare(strict_types=1);
namespace App\Process;
use Hyperf\Process\Annotation\Process;
/**
* @Process(name="demo_process")
*/
class DemoProcess extends AbstractProcess
{
public function handle(): void
{
$logger = $this->container->get(StdoutLoggerInterface::class);
while (true) {
$redis = $this->container->get(\Redis::class);
$count = $redis->llen('queue:failed');
if ($count > 0) {
$logger->warning('The num of failed queue is ' . $count);
}
sleep(1);
}
}