Java实现定时任务的示例代码

目录
  • xxl-job官网
  • 引入依赖
  • 配置信息(application.properties)
  • 配置类(XxlJobConfiguration)
  • 调用xxl-job-admin模块的接口
  • 添加调度任务
  • 调度任务

xxl-job官网

https://www.xuxueli.com/xxl-job/

调用xxl-job中的xxl-job-admin模块启用

引入依赖

<!--    调度任务    -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.3.0</version>
        </dependency>

配置信息(application.properties)

### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8883/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=default_token
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-sample
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/Users/linyanxia/Downloads/common/log/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=-1

配置类(XxlJobConfiguration)

@Slf4j
@Configuration
public class XxlJobConfiguration {

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.executor.appname}")
    private String appname;

    @Value("${xxl.job.executor.ip}")
    private String ip;

    @Value("${xxl.job.executor.port}")
    private int port;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        log.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
        return xxlJobSpringExecutor;
    }

}

调用xxl-job-admin模块的接口

@Component
@Slf4j
public class XxlJobUtil {
//    public static Logger logger =  LoggerFactory.getLogger(ApiUtil.class);

    private static String cookie="";

    private static String prePath = "/jobinfo";

    private static String xxlJobAdminHost;

    public static JSONObject getPageList(Integer jobId,Integer pageSize,Integer pageNum) throws Exception {
        //jobGroup: 2
        //triggerStatus: -1
        //jobDesc:
        //executorHandler:
        //author:
        //start: 0
        //length: 10
        String path = prePath + "/pageList";
        Map<String,Object> formMap = new HashMap<>();
        formMap.put("jobGroup",1);
        formMap.put("triggerStatus",-1);
        formMap.put("start",(pageNum-1)*pageSize);
        formMap.put("start",(pageNum-1)*pageSize);
        formMap.put("length",pageSize);
        formMap.put("jobId",jobId);
        return doPost(xxlJobAdminHost,path,formMap);

    }

//    /findById
    public static JSONObject getJobById(Integer jobId) throws Exception {
        //jobGroup: 2
        //triggerStatus: -1
        //jobDesc:
        //executorHandler:
        //author:
        //start: 0
        //length: 10
        String path = prePath + "/findById";
        Map<String,Object> formMap = new HashMap<>();
        formMap.put("jobId",jobId);
        return doPost(xxlJobAdminHost,path,formMap);

    }

    /**
     * 新增/编辑任务
     * @param url
     * @param requestInfo
     */
    public static JSONObject addJob(String url,Map requestInfo) throws Exception {
        String path = "/jobinfo/add";
        return doPost(url,path,requestInfo);
    }

    /**
     * 编辑任务
     * /xxl-job-admin/jobinfo/update
     */
    public static JSONObject editJobSchedule(Integer jobId,String schedule) throws Exception {
        JSONObject jsonObject = XxlJobUtil.getJobById(jobId);
        if (!jsonObject.getString("code").equals("200")){
            throw new RuntimeException("没有该调度任务");
        }
        Map<String,Object> formMap = new HashMap<>();
//        formMap.put("id",jobId);
        Iterator iter = jsonObject.getJSONObject("content").entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry entry = (Map.Entry) iter.next();
//            System.out.println(entry.getKey().toString());
//            System.out.println(entry.getValue().toString());
            if (entry.getKey().toString().contains("scheduleConf")){
                formMap.put(entry.getKey().toString(),schedule);
            }else {
                if (entry.getKey().toString().contains("Time")||entry.getKey().toString().contains("time")){
                    continue;
                }
                formMap.put(entry.getKey().toString(),entry.getValue());
            }

        }
        formMap.put("cronGen_display",schedule);
        formMap.put("schedule_conf_CRON",schedule);
//            System.out.println(jsonObject);
        //jobGroup: 1
        //jobDesc: TB_SCYX_GCZB_TOP10_FACT
        //author: admin
        //alarmEmail:
        //scheduleType: CRON
        //scheduleConf: 1 17 11 ? * 3
//=        //cronGen_display: 1 17 11 ? * 3
//=        // schedule_conf_CRON: 1 17 11 ? * 3
//=        //schedule_conf_FIX_RATE:
//=        //schedule_conf_FIX_DELAY:
        //executorHandler: testjob
        //executorParam: TB_SCYX_GCZB_TOP10_FACT
        //executorRouteStrategy: ROUND
        //childJobId:
        //misfireStrategy: DO_NOTHING
        //executorBlockStrategy: SERIAL_EXECUTION
        //executorTimeout: 0
        //executorFailRetryCount: 0
        //id: 26

        String path = "/jobinfo/update";
        JSONObject resultJson = doPost(xxlJobAdminHost,path,formMap);
        if (!resultJson.getString("code").equals("200")){
            throw new Exception("更新任务调度时间失败");
        }
        return resultJson;
    }

    /**
     * 删除任务
     * @param id
     * @return
     */
    public static JSONObject deleteJob(int id) throws Exception {
        String path = "/jobinfo/remove";
        Map<String,Object> formMap = new HashMap<>();
        formMap.put("id",id);
        return doPost(xxlJobAdminHost,path,formMap);
    }

    /**
     * 单次执行任务
     * @param url
     * @param id
     * @param executorParam
     * @return
     */
    public static JSONObject triggerJob(String url,Integer id,String executorParam) throws Exception {
        String path = "/jobinfo/trigger";
        Map<String,Object> formMap = new HashMap<>();
        formMap.put("id",id);
        formMap.put("executorParam",executorParam);
        return doPost(url,path,formMap);

    }

    /**
     * 开始任务
     * @param url
     * @param id
     * @return
     */
    public static JSONObject startJob(String url,Integer id) throws Exception {
        String path = "/jobinfo/start";
        Map<String,Object> formMap = new HashMap<>();
        formMap.put("id",id);
        return doPost(url,path,formMap);
    }

    /**
     * 停止任务
     * @param url
     * @param id
     * @return
     */
    public static JSONObject stopJob(String url, Integer id) throws Exception {
        String path = "/jobinfo/stop";
        Map<String,Object> formMap = new HashMap<>();
        formMap.put("id",id);
        return doPost(url,path,formMap);
    }

    public static JSONObject getLogPage(Integer jobId,String filterTime,Integer pageNum,Integer pageSize) throws Exception {
        String path = "/joblog/pageList";
        //jobGroup: 1
        //jobId: 0
        //logStatus: -1
        //filterTime: 2021-09-01 00:00:00 - 2021-09-30 23:59:59
        //start: 0
        //length: 10
        Map<String,Object> formMap = new HashMap<>();
        formMap.put("jobId",jobId);
        formMap.put("jobGroup",1);
        formMap.put("logStatus",-1);
        formMap.put("start",pageNum);
        formMap.put("length",pageSize);
        formMap.put("filterTime",filterTime);
        return doPost(xxlJobAdminHost,path,formMap);
    }
    public static JSONObject getLogDetailCat(Integer logId,String executorAddress,Long triggerTime,Integer fromLineNum) throws Exception {
        String path = "/joblog/logDetailCat";
        //executorAddress: http://192.168.14.207:9946/
        //triggerTime: 1633679504000
        //logId: 1157
        //fromLineNum: 159
        Map<String,Object> formMap = new HashMap<>();
        formMap.put("executorAddress",executorAddress);
        formMap.put("triggerTime",triggerTime);
        formMap.put("logId",logId);
        formMap.put("fromLineNum",fromLineNum);
        return doPost(xxlJobAdminHost,path,formMap);
    }

    public static JSONObject doPost(String url,String path,Map<String,Object> formMap) throws Exception {
        String targetUrl = url + path;
        HttpResponse response = HttpRequest.post(targetUrl)
                .header("cookie", getCookie())
                .form(formMap)
                .execute();
        JSONObject result = JSONObject.parseObject(response.body());
        // && result.getString("code").equals("200")
        if (response.getStatus() == 200){
            return JSONObject.parseObject(response.body());
        }else {
            log.info("请求失败,path:{}\n "+response.body(),path);
            throw new RuntimeException("请求失败\n "+response.body());
        }
    }

    public static JSONObject doGet(String url,String path)  {
        String targetUrl = url + path;
        JSONObject result = JSONObject.parseObject(HttpRequest.get(targetUrl)
                .header("cookie", getCookie()).execute().body());
        return result;
    }

    public static String login(String url, String userName, String password)  {
        String path = "/login";
        String targetUrl = url + path;
        Map<String,Object> loginMap = new HashMap<>();
        loginMap.put("userName",userName);
        loginMap.put("password",password);
        HttpResponse response = HttpRequest.post(targetUrl)
                .form(loginMap).execute();
        if (response.getStatus() == 200) {
            List<HttpCookie> cookies = response.getCookies();
            StringBuffer tmpcookies = new StringBuffer();
            for (HttpCookie c : cookies) {
                tmpcookies.append(c.toString() + ";");
            }
            cookie = tmpcookies.toString();
        } else {
            cookie = "";
        }
        return cookie;
    }

    public static String getCookie(){
//        System.out.println("getcookie:"+xxlJobAdminHost);
        if (StringUtils.isNotBlank(cookie)){
            return cookie;
        }else {
            return login(xxlJobAdminHost,"admin","123456");
        }
    }

    @Value("${xxl.job.admin.addresses}")
    public  void setXxlJobAdminHost(String xxlJobAdminHost) {
        XxlJobUtil.xxlJobAdminHost = xxlJobAdminHost;
    }

}

添加调度任务

Map<String,Object> requestInfo = new HashMap<>();
        requestInfo.put("jobGroup",1);
        requestInfo.put("jobDesc",collectorTask.getTaskName());
        requestInfo.put("executorRouteStrategy","ROUND");
        requestInfo.put("scheduleType","CRON");
        requestInfo.put("cronGen_display",collectorTask.getDispatchTime());
        requestInfo.put("scheduleConf",collectorTask.getDispatchTime());
        requestInfo.put("schedule_conf_CRON",collectorTask.getDispatchTime());
        requestInfo.put("glueType","BEAN");
        requestInfo.put("executorHandler","startTasks");
        requestInfo.put("executorBlockStrategy","SERIAL_EXECUTION");
        requestInfo.put("misfireStrategy","DO_NOTHING");
        requestInfo.put("executorTimeout",0);
        requestInfo.put("executorFailRetryCount",0);
        requestInfo.put("author","admin");
        requestInfo.put("alarmEmail","");
        requestInfo.put("executorParam",id);
        requestInfo.put("glueRemark","GLUE代码初始化");
        com.alibaba.fastjson.JSONObject response= XxlJobUtil.addJob(addresses,requestInfo);
        log.info("新增xxlJob任务 {}",response);
        if (!response.getString("code").equals("200")){
            throw new Exception("新增任务调度失败");
        }
//      获取生成调度任务ID。根据此ID去执行调度任务
        collectorTask.setXxlJobId(response.getInteger("content"));

//        删除调度任务
        XxlJobUtil.deleteJob(task_id.getXxlJobId());

//        修改调度任务
        XxlJobUtil.editJobSchedule(collectorTask.getXxlJobId(),collectorTask.getDispatchTime());

调度任务

@RestController
@RequestMapping("/apiSyncTask")
public class ApiSyncTaskController {

    @Value("${xxl.job.admin.addresses}")
    private String xxlJobAdminHost;

    @Autowired(required = false)
    private CollectorTaskMapper collectorTaskMapper;

//    单次启动任务
    @GetMapping("/trigger")
    public R triggerTask(Integer id, String executorParam) {
        try {
            System.out.println(xxlJobAdminHost);
            return R.ok(XxlJobUtil.triggerJob(xxlJobAdminHost, id, executorParam));
        } catch (Exception e) {
            e.printStackTrace();
            return R.failed(e.getMessage());
        }
    }

//    启动任务
    @GetMapping("/start")
    public R startTask(Integer id) {
        try {
            JSONObject jsonObject = XxlJobUtil.startJob(xxlJobAdminHost, id);
            if (jsonObject.getString("code").equals("200")) {
                CollectorTask task = new CollectorTask();
                task.setStates(1);
                collectorTaskMapper.update(task,new QueryWrapper<CollectorTask>().eq("XXL_JOB_ID",id));
                return R.ok(jsonObject);
            }
            return R.failed(jsonObject);
        } catch (Exception e) {
            e.printStackTrace();
            return R.failed(e.getMessage());
        }
    }

//    停止任务
    @GetMapping("/stop")
    public R stopTask(Integer id) {
        try {
            JSONObject jsonObject = XxlJobUtil.stopJob(xxlJobAdminHost, id);
            if (jsonObject.getString("code").equals("200")) {
                CollectorTask task = new CollectorTask();
                task.setStates(0);
                collectorTaskMapper.update(task,new QueryWrapper<CollectorTask>().eq("XXL_JOB_ID",id));
                return R.ok(jsonObject);
            } else {
                return R.failed(jsonObject);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return R.failed(e.getMessage());
        }
    }

//    获取任务列表
    @GetMapping("/getJobPage")
    public R getJobPage(Integer pageSize,Integer pageNum,Integer jobId){
        try {
            return R.ok(XxlJobUtil.getPageList(jobId,pageSize,pageNum));
        } catch (Exception e) {
            e.printStackTrace();
            return  R.failed(e.getMessage());
        }
    }

//    调度任务记录
//    获取任务日志列表
    @GetMapping("/getLogPage")
    public R getLogPage(Integer pageSize,Integer pageNum,Integer jobId,String filterTime){
        try {
            return R.ok(XxlJobUtil.getLogPage(jobId, filterTime, (pageNum-1)*pageSize, pageSize));
        } catch (Exception e) {
            e.printStackTrace();
            return  R.failed(e.getMessage());
        }
    }

//    获取任务
    @GetMapping("/getJob")
    public R getLogPage(Integer jobId){
        try {
            return R.ok(XxlJobUtil.getJobById(jobId));
        } catch (Exception e) {
            e.printStackTrace();
            return  R.failed(e.getMessage());
        }
    }

//    获取任务日志详情
    @GetMapping("/getLogDetail")
    public R getLogDetail(Integer logId,String executorAddress,Long triggerTime,Integer fromLineNum){
        try {
            return R.ok(XxlJobUtil.getLogDetailCat(logId, executorAddress, triggerTime, fromLineNum));
        } catch (Exception e) {
            e.printStackTrace();
            return  R.failed(e.getMessage());
        }
    }

}

以上就是Java实现定时任务的示例代码的详细内容,更多关于Java定时任务的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java项目实现定时任务的三种方法

    目录 1 使用java.util.Timer 2 使用ScheduledExecutorService 3 使用Spring Task 总结 1 使用java.util.Timer 这种方式的定时任务主要用到两个类,Timer 和 TimerTask,使用起来比较简单.其中 Timer 负责设定 TimerTask 的起始与间隔执行时间. TimerTask是一个抽象类,new的时候实现自己的 run 方法,然后将其丢给 Timer 去执行即可. 代码示例: import java.time.L

  • Java定时任务原理详解

    目录 序章 一.Scheduled 1.1 使用方法 1.2 源码分析 二.QUARTZ 2.1 使用方法 2.2 源码分析 序章 定时任务实现方式 当下,java编码过程中,实现定时任务的方式主要以以下两种为主 spring框架的@Scheduled quzrtz框架 网络上关于这两种框架的实践和配置相关的教程很多,这里不再赘述. 本文主要就二者的框架原理实现做一个入门引导,为了解深层实现细节做一定的铺垫. 本文源码版本 spring-context-3.2.18.RELEASE.jar qu

  • Java实现定时任务的方法详解

    目录 前言 定时任务是什么 定时任务的有哪些是实现方式 纯手写单线程循环 Timer 和它的小伙伴 ScheduledExecutorService Spring 提供的定时任务 总结 前言 学过定时任务,但是我忘了,忘得一干二净,害怕,一直听别人说: 你写一个定时任务就好了. 写个定时任务让他去爬取就行了. 我不会,所以现在得补回来了,欠下的终究要还的,/(ㄒoㄒ)/~~ 定时任务是什么 大家都用过闹钟,闹钟可以说是一种定时任务. 比如我们设定了周一到周五早上7点半的时间响铃,那么闹钟就会在周

  • Java实现定时任务最简单的3种方法

    目录 一.Timer 二.ScheduledExecutorService 三.Spring Task 1.开启定时任务 2.添加定时任务 Cron 表达式 知识扩展:分布式定时任务 1.ZSet 实现方式 2.键空间通知 总结 一.Timer Timer是JAVA自带的定时任务类,实现如下: public class MyTimerTask { public static void main(String[] args) { // 定义一个任务 TimerTask timerTask = ne

  • Java实现定时任务

    本文实例为大家分享了Java实现定时任务的具体代码,供大家参考,具体内容如下 1 使用java.util.Timer 这种方式的定时任务主要用到两个类,Timer 和 TimerTask,使用起来比较简单.其中 Timer 负责设定 TimerTask 的起始与间隔执行时间. TimerTask是一个抽象类,new的时候实现自己的 run 方法,然后将其丢给 Timer 去执行即可. 代码示例: import java.time.LocalDateTime; import java.util.T

  • Java实现定时任务的示例代码

    目录 xxl-job官网 引入依赖 配置信息(application.properties) 配置类(XxlJobConfiguration) 调用xxl-job-admin模块的接口 添加调度任务 调度任务 xxl-job官网 https://www.xuxueli.com/xxl-job/ 调用xxl-job中的xxl-job-admin模块启用 引入依赖 <!-- 调度任务 --> <dependency> <groupId>com.xuxueli</gro

  • SpringBoot实现动态定时任务的示例代码

    目录 前言 配置文件 定时任务核心类 提供修改cron表达式的controller 前言 之前在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,实在不太灵活.现在我们就来实现可以动态修改cron表达式的定时任务. 配置文件 application-task.yml,其余的配置 application.yml 等就按照springBoot正常配置即可 task: cron: 0/10 * * * * ? t

  • Java模拟UDP通信示例代码

    Java基础:模拟UDP通信 1.一次发送,一次接收 1.1.发送方 // 发送端,不需要连接服务器 public class UdpClientDemo {     public static void main(String[] args) throws Exception {         // 1. 发送数据包需要一个Socket         DatagramSocket socket = new DatagramSocket();         // 1.2 建立一个包    

  • java实现发送邮件的示例代码

    代码 import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; import javax.mail.Session; import javax.mail.MessagingException; import javax.mail.Transport; /** * @author BuNuo */ public

  • java生成图片验证码的示例代码

    给大家分享一款java生成验证码的源码,可设置随机字符串,去掉了几个容易混淆的字符,还可以设置验证码位数,比如4位,6位.当然也可以根据前台验证码的位置大小,设置验证码图片的大小.下边是源码分享,直接看吧,很简单! 创建servlet类 import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServ

  • java 格式化时间的示例代码

    package jkcs; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class jdcs { public static void main(String[] args) th

  • SpringBoot Scheduling定时任务的示例代码

    目录 开启定时任务注解@EnableScheduling @Scheduled添加定时任务 Cron表达式 在线cron工具 适应场景 springBoot提供了定时任务的支持,通过注解简单快捷,对于日常定时任务可以使用. 开启定时任务注解@EnableScheduling @EnableScheduling @SpringBootApplication public class DockerApplication { public static void main (String[] args

  • Java实现黄金分割法的示例代码

    目录 1.概述 2.黄金分割法 3.修改后的黄金分割算法 4.编程实现修改后的黄金分割算法 1.概述 黄金分割法是一种区间收缩方法. 所谓区间收缩方法,指的是将含有最优解的区间逐步缩小,直至区间长度为零的方法.比如,为求函数f(x)在区间[a,b]上的最小值点,可在该区间中任取两点x1.x2,通过比较函数f(x)在这两点的函数值或者导数值等,来决定去掉一部分区间[a,x1​]或者[x2​,b],从而使搜索区间长度变小,如此迭代,直至区间收缩为一点为止,或区间长度小于某给定的精度为止. 对于区间[

  • Java实现二叉树的示例代码(递归&迭代)

    目录 1.二叉树基本概念见上节:详解Java中二叉树的基础概念(递归&迭代) 2.本次展示链式存储 以此图为例,完整代码如下: //基础二叉树实现 //使用左右孩子表示法 import java.util.*; import java.util.Deque; public class myBinTree { private static class TreeNode{ char val; TreeNode left; TreeNode right; public TreeNode(char va

  • Java实现归并排序的示例代码

    目录 1.算法理解 2.实现代码 3.实现效果 1.算法理解 参考:图解Java中归并排序算法的原理与实现 2.实现代码 import java.lang.reflect.Array; import java.util.*; public class MergeSort{ // 我们的算法类不允许产生任何实例 private MergeSort(){} // 将arr[l...mid]和arr[mid+1...r]两部分进行归并 private static void merge(Compara

随机推荐