# xxl-job 地址
[分布式任务调度平台XXL-JOB](https://www.xuxueli.com/xxl-job/)

# 调度中心配置
## 调度中心容器
```
/**
* 如需自定义 mysql 等配置，可通过 "-e PARAMS" 指定，参数格式 PARAMS="--key=value  --key2=value2" ；
* 配置项参考文件：/xxl-job/xxl-job-admin/src/main/resources/application.properties
* 如需自定义 JVM内存参数 等配置，可通过 "-e JAVA_OPTS" 指定，参数格式 JAVA_OPTS="-Xmx512m" ；
*/
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d xuxueli/xxl-job-admin:2.5.3
```
这个选用 2.5.3 版本， 可用Java 8


## 调度中心SQL
调度数据库初始化SQL脚本 

[初始化SQL文件](./xxx_job.sql)

# PHP 执行器配置
[PHP 执行器仓库地址](http://gitlab.test.2vm.co/qhz/ydd-crontab)

执行器节点注册

![节点注册](../images/xxl-job/2.png)
![节点注册](../images/xxl-job/3.png)


# PHP 执行器任务编写

使用 Bean 模式进行开发. Bean 模式任务。支持基于类的开发方式，每个任务对应一个PHP类

## 编写一个Job类型
![Job类型](../images/xxl-job/4.png)
![Job类型](../images/xxl-job/1.png)

对应执行器实现的代码
```php
<?php
namespace App\Job;

use Hyperf\Di\Annotation\Inject;
use Hyperf\XxlJob\Annotation\XxlJob;
use Hyperf\XxlJob\Handler\AbstractJobHandler;
use Hyperf\XxlJob\Logger\JobExecutorLoggerInterface;
use Hyperf\XxlJob\Requests\RunRequest;
use App\Model\Brand\PointSet;

#[XxlJob("demoJobClassHandler")]
class DemoJobClass extends AbstractJobHandler
{

    #[Inject]
    protected JobExecutorLoggerInterface $jobExecutorLogger;

    /**
     * 执行任务
     */
    public function execute(RunRequest $request): void
    {
        // 获取参数
        $params = $request->getExecutorParams();
        // 获取 LogId
        $logId = $request->getLogId();

        $brand_id  = $params ?? 0;
        // 获取需要清理积分的品牌商
        $query = PointSet::with('brand');
        if($brand_id){
            $query->where('brand_id',$brand_id);
        }
        $brands = $query->get();
        // 过滤过期的品牌商
        $time = time();
        foreach ( $brands as $brand ) {
            $data = [
                'brand_name' => $brand['brand']['brand_name'] ?? '',
                'consume_explain' => $brand['consume_explain'],
                'obtain_point' => $brand['obtain_point']
            ];

            $this->jobExecutorLogger->info('brandInfo:' . json_encode($data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE));
        }

        $this->jobExecutorLogger->info('logId:' . $logId);
        $this->jobExecutorLogger->info('params:' . $params);
        $this->jobExecutorLogger->info('success');
    }
}

```

对应参数的执行结果
![Job类型](../images/xxl-job/5.png)
![Job类型](../images/xxl-job/6.png)


# 命令行任务
为了能兼顾以前有的定时任务或者对应脚本任务。可以使用 命令行模式

1. 首先定义应该执行的任务
![命令行任务](../images/xxl-job/7.png)
![命令行任务](../images/xxl-job/8.png)

2. php 执行器端的代码

```php
<?php
namespace App\Job;

use Hyperf\Di\Annotation\Inject;
use Hyperf\XxlJob\Annotation\XxlJob;
use Hyperf\XxlJob\Logger\JobExecutorLoggerInterface;
use Hyperf\XxlJob\Requests\RunRequest;

class DemoJob
{
    
    #[Inject]
    protected JobExecutorLoggerInterface $jobExecutorLogger;
    /**
     * 3、执行命令.
     */
    #[XxlJob('commandJobHandler')]
    public function commandJobHandler(RunRequest $request)
    {
        //获取参数
        //例子:php -v
        $command = $request->getExecutorParams();
        $result = shell_exec($command);

        $message = str_replace("\n", '<br>', $result);
        $this->jobExecutorLogger->info($message);
    }
}

```


3. 执行任务结果
![命令行任务](../images/xxl-job/9.png)
![命令行任务](../images/xxl-job/10.png)

# 总结

xxl-job 任务管理 中的 任务参数。没有与业务结合，现在直接写死对应参数。只能让执行器对传入的参数进行解析

php 执行器部分的php代码在 PHP8 上会有各种警告的语句(非致命错误)。 php7 情况下 hyperf/xxl-job-incubator 注解不生效. 对于旧有业务代码不太友好