怎么设置hyperf定时任务之间的阻塞,当前运行中定时任务为执行完,下一次不执行
时间: 2023-07-04 17:08:39 浏览: 135
SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)推荐
5星 · 资源好评率100%
在 Hyperf 中,可以通过设置定时任务的互斥锁来实现阻塞。具体步骤如下:
1. 在 `config/autoload/` 目录下创建一个名为 `mutex.php` 的配置文件,添加以下内容:
```php
<?php
return [
'default' => [
'driver' => Hyperf\AsyncQueue\Driver\RedisDriver::class,
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'auth' => null,
'db' => 0,
'pool' => 'default',
],
],
];
```
2. 在定时任务中使用 `Mutex` 类来获取互斥锁,如果获取锁成功,则执行任务,执行完毕后释放锁;如果获取锁失败,则表示上一个任务还在执行中,不再执行本次任务。
```php
<?php
use Hyperf\Di\Annotation\Inject;
use Hyperf\Utils\Coroutine;
use Hyperf\Utils\Mutex;
class MyTask
{
/**
* @Inject
* @var \Hyperf\Utils\Coroutine\Locker\RedisLocker
*/
protected $locker;
public function execute()
{
$mutex = new Mutex('my_task');
if ($mutex->get() === false) {
return;
}
// 任务执行代码
$mutex->release();
}
}
```
上述代码中,`Mutex` 类的构造函数参数为互斥锁的名称,可以根据实际情况进行设置。如果获取锁成功,`get()` 方法会返回一个 `true` 值,否则会返回一个 `false` 值。获取锁成功后,执行任务,执行完毕后使用 `release()` 方法释放锁。
阅读全文