# 计划任务

### 1、任务周期定义

![](/assets/task_define.png)

新建一条计划任务后，可点击任务计划修改，打开计划修改页面：

![](/assets/schedule_edit.png)

计划任务可以定义五种频率，分别是：月、周、日、时、分。

月：可定义每几个月的第几天（可选择多个，使用逗号隔开）执行，同时可以指定执行的具体时分。

周：可定义每几个周的周几执行，同时可指定执行的具体时分。

日：可定义每几天执行一次，同时可指定执行的具体时分。

时：可定义每几个小时执行一次。

分：可定义每几分钟执行一次。

### 2、任务维护

可在任务维护主界面进行新增、修改、删除操作。

![](/assets/task_maintain.png)

新增一条任务记录之后可以对该任务进行参数配置和权限控制：

#### 2.1 任务配置

点击任务配置，打开任务配置明细弹窗，可在此处添加、删除、修改任务所需参数。                                                                                             ![](/assets/task_parameter.png)

#### 2.2 权限控制

点击权限设置，打开权限控制明细弹窗，可在此处对任务权限人进行添加、删除、修改操作：

角色代码为权限人的代码，角色名称为权限人的名字，起始日期和结束日期控制该人员可对该任务操作的时间。                                         ![](/assets/task_authority.png)

#### 2.3 任务类的编写

想要自定义一个job，必须要继承一个抽象类AbstractJob，然后在`safeExecute()`方法中执行业务代码，示例代码如下：

```java
public class demoJob extends AbstractJob{
    @Autowired
    private xxxService service;//业务类
    @Override
    public void safeExecute(JobExecutionContext jobExecutionContext) throws Exception {
        //map中可以获取上方定义的参数，key为参数名称，value为参数值
        JobDataMap map = jobExecutionContext.getMergedJobDataMap();
        try {
           service.dosomething();
        } catch (Exception e) {
            if (logger.isErrorEnabled()) {
                logger.error(e.getMessage(), e);
            }
            exception = e;
            throw e;
        }
        if (exception != null) {
            setExecutionSummary(exception.getClass().getName() + ":" + exception.getMessage());
        } else {
            setExecutionSummary("执行完成！" );
        }     
        
    }
    @Override
    public boolean isRefireImmediatelyWhenException() {
        //任务发生异常时候进行的动作
        //false 挂起当前JOB等待处理
        //true 继续执行
        return false;
    }

}
```

注意：

调用`setExecutionSummary()`方法可以在执行记录中，记录你的业务数据的记录，或者抛出的异常的具体信息。

在上下文中获取JobDataMap可以拿到你在任务配置中定义的参数

