计划任务-定时任务
# 计划任务-定时任务
# 介绍
计划任务用来用户在e-cology系统自由定义一些需要定时执行的操作,它是由Quartz这一个开源的作业调度框架来实现;通过配置调度时间和自行开发调度动作来实现需要定时执行的任务。在开发时需要实现e-cology提供的自定义动作接口。
# 应用场景以及使用方法
# 应用场景
当我们业务中需要定时去跑数据或者需要定时执行某些业务逻辑时,即可以使用到定时任务,比如与第三方数据同步(推送数据或拉取数据)等
# 使用方法
在系统后台中有集成中心,找到计划任务后可以新创建计划任务,然后会有创建指引和说明
新建计划任务卡片中需要填写计划任务标识和计划任务类,同时需要配置好对应的定时时间,使用的是Cron
表达式
定时任务说明 1、按照设定的时间定时执行任务,计划任务标识不能重复 2、计划任务类必须是类的全名,该类必须继承weaver.interfaces.schedule.BaseCronJob
类,重写方法public void execute() {}
3、时间格式按Cron表达式的定义
# 代码示例
我们编写一个定时任务,该定时任务有两个参数,接下来使用代码来编写一个定时任务
package weaver.schedule.example;
import lombok.Getter;
import lombok.Setter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import weaver.interfaces.schedule.BaseCronJob;
/**
* <h1>测试定时任务dome</h1>
* </br>
* <p>create: 2023/12/24 12:02</p>
*
* <p></p>
*
* @author youHong.ai
*/
@Setter
@Getter
public class DomeTestCronJob extends BaseCronJob {
/** 定时任务参数,只能使用string类型来接受 */
private String testParam;
private static final Logger logger = LoggerFactory.getLogger("cus");
@Override
public void execute() {
// 使用基类的方法获取cron表达式
String cronExpr = getCronExpr();
logger.info(this.getClass().getName() + " start..... CronExpr: " + cronExpr + " testParam: " + testParam);
}
}
我们在WEB-INF/log4jinit.properties
中加入cus的日志配置信息
编译成功后打包到服务器,并且修改对应的log4jinit.properties
文件重启后我们可以配置定时任务并且手动执行测试是否能够正常运转
配置完成后,我们可以进行手动执行,之后可以查看日志ecology/log/cus/cus.log
日志,或者登录系统管理员账号在前端查看日志/log/cus/cus.log
从日志中我们能看出,定时任务执行了,并且传递的参数也正常解析到了
# debug
这里的debug代码有多重形式,一种是使用本地单元测试进行debug,另外一种是使用idea远程debug,当然如果开发环境搭建的时候采用的其他的搭建形式,启动应用程序是从idea启动的,则debug就简单很多
本地单元测试
本地单元测试之前文档中有提及,在开发环境搭建中有讲过,必要的两个设置
// 设置服务名称,这里的名称也可以理解为数据源,默认是ecology
GCONST.setServerName("ecology");
// 设置根路径,这里设置的是服务的路径地址,如果没有吧WEB-INF文件放到项目中,则这里可以填写实际的ecology的路径地址
GCONST.setRootPath("/your_path/src/main/resources/");
同时我们创建两个一个单元测试的基类,加入了before
方法和注解
package e9dev.dome.envtest;
import com.alibaba.fastjson.JSON;
import org.junit.Before;
import weaver.general.GCONST;
import weaver.hrm.User;
/**
* <h1>环境检测</h1>
* </br>
* <p>create: 2023/12/22 11:22</p>
*
* <p></p>
*
* @author youHong.ai
*/
public class E9BaseTest {
public static void main(String[] args) {
// 设置服务名称,这里的名称也可以理解为数据源,默认是ecology
GCONST.setServerName("ecology");
// 设置根路径,这里设置的是服务的路径地址,如果没有吧WEB-INF文件放到项目中,则这里可以填写实际的ecology的路径地址
GCONST.setRootPath("/Users/aoey.oct.22/code/dome/e9-dev-demo/src/main/resources/");
User user = new User(1);
System.out.println(JSON.toJSONString(user));
}
/**
* ************************************************************
* <h2>针对后期使用单元测试,我们可以将路径地址写到before中这样就不用每次都重新设置和编写了</h2>
* <i>2023/12/22 11:37</i>
*
* @author youHong.ai
* ************************************************************
*/
@Before
public void before(){
// 设置服务名称,这里的名称也可以理解为数据源,默认是ecology
GCONST.setServerName("ecology");
// 设置根路径,这里设置的是服务的路径地址,如果没有吧WEB-INF文件放到项目中,则这里可以填写实际的ecology的路径地址
GCONST.setRootPath("/Users/aoey.oct.22/code/dome/e9-dev-demo/src/main/resources/");
}
}
之后的单元测试,我们就可以继承E9BaseTest
来进行单元测试
package e9dev.dome.envtest;
import org.junit.Test;
import weaver.schedule.example.DomeTestCronJob;
public class ActionAndCronJobTest extends E9BaseTest {
@Test
public void testCronJob() {
DomeTestCronJob cronJob = new DomeTestCronJob();
cronJob.setTestParam("单元测试参数");
cronJob.execute();
}
}
如果采用远程debug,那么需要再服务端修改启动参数,这里以Resin
为例,我们需要修改Resin4/conf/resin.properties
中的jvm_args
参数,在参数中添加-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=${port}
远程debug参数
之后重启服务,在idea中配置如下
好了,接下来就可以进行远程debug了,我们debug的形式运行我们配置的远程debug
运行成功后,我们可以到前台进行手动执行,让请求进入我们的方法
可以看到我们成功debug(断点出现偏差是因为本地代码与服务器代码不一致导致的)