SpringBoot项目中通过代码方式手动增删改Xxl-Job定时任务以及定时任务的执行

前言

本篇文章主要介绍一下通过代码的方式远程调用Xxl-Job的API接口去实现,代码的方式去创建和执行定时任务等功能。

网上找了很多相关案例,有相关的但是都不是很全,在自己已有的SpringBoot项目里去通过代码手动修改,索性自己写一篇

前置配置可以看我以前的文章:

xxl-job定时任务配置应用以及添加到自己已有的springboot项目中实现动态API调用_风楠丶的博客-CSDN博客

具体操作如下:

一、修改admin调度中心文件

因为远程调用Xxl-Job的API,想要调用必须要登录,但是作者已经帮我们写好了一个注解,可以直接调用跳过登录的环节,这样我们就能不登录而进行请求 。这个注解就是 @PermissionLimit(limit = false)  ,默认是true,也就是需要做登录验证,当日这样做也有安全性需要各位去考虑,可以在内网使用。

首先是修改JobInfoController文件,添加几个自定义的方法(我这边写全一点方便大家参考)

这边新增的方法与 JobInfoController 文件中的方法具体逻辑是一样的,只是换个接口名。

package com.xxl.job.admin.controller;

import com.xxl.job.admin.controller.annotation.PermissionLimit;
import com.xxl.job.admin.core.cron.CronExpression;
import com.xxl.job.admin.core.exception.XxlJobException;
import com.xxl.job.admin.core.model.XxlJobGroup;
import com.xxl.job.admin.core.model.XxlJobInfo;
import com.xxl.job.admin.core.model.XxlJobUser;
import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
import com.xxl.job.admin.core.scheduler.MisfireStrategyEnum;
import com.xxl.job.admin.core.scheduler.ScheduleTypeEnum;
import com.xxl.job.admin.core.thread.JobScheduleHelper;
import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
import com.xxl.job.admin.core.util.I18nUtil;
import com.xxl.job.admin.dao.XxlJobGroupDao;
import com.xxl.job.admin.service.LoginService;
import com.xxl.job.admin.service.XxlJobService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
import com.xxl.job.core.glue.GlueTypeEnum;
import com.xxl.job.core.util.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
import java.util.*;

/**
 * index controller
 * @author xuxueli 2015-12-19 16:13:16
 */
@Controller
@RequestMapping("/jobinfo")
public class JobInfoController {
	private static Logger logger = LoggerFactory.getLogger(JobInfoController.class);

	@Resource
	private XxlJobGroupDao xxlJobGroupDao;
	@Resource
	private XxlJobService xxlJobService;
	
	@RequestMapping
	public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) {

		// 枚举-字典
		model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values());	    // 路由策略-列表
		model.addAttribute("GlueTypeEnum", GlueTypeEnum.values());								// Glue类型-字典
		model.addAttribute("ExecutorBlockStrategyEnum", ExecutorBlockStrategyEnum.values());	    // 阻塞处理策略-字典
		model.addAttribute("ScheduleTypeEnum", ScheduleTypeEnum.values());	    				// 调度类型
		model.addAttribute("MisfireStrategyEnum", MisfireStrategyEnum.values());	    			// 调度过期策略

		// 执行器列表
		List<XxlJobGroup> jobGroupList_all =  xxlJobGroupDao.findAll();

		// filter group
		List<XxlJobGroup> jobGroupList = filterJobGroupByRole(request, jobGroupList_all);
		if (jobGroupList==null || jobGroupList.size()==0) {
			throw new XxlJobException(I18nUtil.getString("jobgroup_empty"));
		}

		model.addAttribute("JobGroupList", jobGroupList);
		model.addAttribute("jobGroup", jobGroup);

		return "jobinfo/jobinfo.index";
	}

	public static List<XxlJobGroup> filterJobGroupByRole(HttpServletRequest request, List<XxlJobGroup> jobGroupList_all){
		List<XxlJobGroup> jobGroupList = new ArrayList<>();
		if (jobGroupList_all!=null && jobGroupList_all.size()>0) {
			XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);
			if (loginUser.getRole() == 1) {
				jobGroupList = jobGroupList_all;
			} else {
				List<String> groupIdStrs = new ArrayList<>();
				if (loginUser.getPermission()!=null && loginUser.getPermission().trim().length()>0) {
					groupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(","));
				}
				for (XxlJobGroup groupItem:jobGroupList_all) {
					if (groupIdStrs.contains(String.valueOf(groupItem.getId()))) {
						jobGroupList.add(groupItem);
					}
				}
			}
		}
		return jobGroupList;
	}
	public static void validPermission(HttpServletRequest request, int jobGroup) {
		XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);
		if (!loginUser.validPermission(jobGroup)) {
			throw new RuntimeException(I18nUtil.getString("system_permission_limit") + "[username="+ loginUser.getUsername() +"]");
		}
	}
	
	@RequestMapping("/pageList")
	@ResponseBody
	@PermissionLimit(limit = false)
	public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = "0") int start,  
			@RequestParam(required = false, defaultValue = "10") int length,
			int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) {
		
		return xxlJobService.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author);
	}

	//任务管理新增定时任务
	@RequestMapping("/add")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> add(XxlJobInfo jobInfo) {
		return xxlJobService.add(jobInfo);
	}
	
	@RequestMapping("/update")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> update(XxlJobInfo jobInfo) {
		return xxlJobService.update(jobInfo);
	}
	
	@RequestMapping("/remove")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> remove(int id) {
		return xxlJobService.remove(id);
	}
	
	@RequestMapping("/stop")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> pause(int id) {
		int i = id;
		return xxlJobService.stop(id);
	}

	//定时任务启动
	@RequestMapping("/start")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> start(int id) {
		return xxlJobService.start(id);
	}
	
	@RequestMapping("/trigger")
	@ResponseBody
	@PermissionLimit(limit = false)
	//@PermissionLimit(limit = false)
	public ReturnT<String> triggerJob(int id, String executorParam, String addressList) {
		// force cover job param
		if (executorParam == null) {
			executorParam = "";
		}

		JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, executorParam, addressList);
		return ReturnT.SUCCESS;
	}

	@RequestMapping("/nextTriggerTime")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<List<String>> nextTriggerTime(String scheduleType, String scheduleConf) {

		XxlJobInfo paramXxlJobInfo = new XxlJobInfo();
		paramXxlJobInfo.setScheduleType(scheduleType);
		paramXxlJobInfo.setScheduleConf(scheduleConf);

		List<String> result = new ArrayList<>();
		try {
			Date lastTime = new Date();
			for (int i = 0; i < 5; i++) {
				lastTime = JobScheduleHelper.generateNextValidTime(paramXxlJobInfo, lastTime);
				if (lastTime != null) {
					result.add(DateUtil.formatDateTime(lastTime));
				} else {
					break;
				}
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			return new ReturnT<List<String>>(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) + e.getMessage());
		}
		return new ReturnT<List<String>>(result);

	}

	/*------------------自定义方法----------------------  */
	@RequestMapping("/addJob")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> addJobInfo(@RequestBody XxlJobInfo jobInfo) {
		return xxlJobService.add(jobInfo);
	}

	@RequestMapping("/updateJob")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> updateJobCron(@RequestBody XxlJobInfo jobInfo) {
		return xxlJobService.update(jobInfo);
	}

	@RequestMapping("/removeJob")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> removeJob(@RequestBody XxlJobInfo jobInfo) {
		return xxlJobService.remove(jobInfo.getId());
	}

	@RequestMapping("/pauseJob")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> pauseJob(@RequestBody XxlJobInfo jobInfo) {
		return xxlJobService.stop(jobInfo.getId());
	}

	@RequestMapping("/startJob")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> startJob(@RequestBody XxlJobInfo jobInfo) {
		return xxlJobService.start(jobInfo.getId());
	}

	@RequestMapping("/addAndStart")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> addAndStart(@RequestBody XxlJobInfo jobInfo) {
		ReturnT<String> result = xxlJobService.add(jobInfo);
		int id = Integer.valueOf(result.getContent());
		xxlJobService.start(id);
		return result;
	}

}

其次是修改JobGroupController 文件,还是新建一个方法

package com.xxl.job.admin.controller;

import com.xxl.job.admin.controller.annotation.PermissionLimit;
import com.xxl.job.admin.core.model.XxlJobGroup;
import com.xxl.job.admin.core.model.XxlJobRegistry;
import com.xxl.job.admin.core.util.I18nUtil;
import com.xxl.job.admin.dao.XxlJobGroupDao;
import com.xxl.job.admin.dao.XxlJobInfoDao;
import com.xxl.job.admin.dao.XxlJobRegistryDao;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.enums.RegistryConfig;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.*;

/**
 * job group controller
 * @author xuxueli 2016-10-02 20:52:56
 */
@Controller
@RequestMapping("/jobgroup")
public class JobGroupController {

	@Resource
	public XxlJobInfoDao xxlJobInfoDao;
	@Resource
	public XxlJobGroupDao xxlJobGroupDao;
	@Resource
	private XxlJobRegistryDao xxlJobRegistryDao;

	@RequestMapping
	@PermissionLimit(limit = false)
	public String index(Model model) {
		return "jobgroup/jobgroup.index";
	}

	@RequestMapping("/pageList")
	@ResponseBody
	@PermissionLimit(limit = false)
	public Map<String, Object> pageList(HttpServletRequest request,
										@RequestParam(required = false, defaultValue = "0") int start,
										@RequestParam(required = false, defaultValue = "10") int length,
										String appname, String title) {

		// page query
		List<XxlJobGroup> list = xxlJobGroupDao.pageList(start, length, appname, title);
		int list_count = xxlJobGroupDao.pageListCount(start, length, appname, title);

		// package result
		Map<String, Object> maps = new HashMap<String, Object>();
		maps.put("recordsTotal", list_count);		// 总记录数
		maps.put("recordsFiltered", list_count);	// 过滤后的总记录数
		maps.put("data", list);  					// 分页列表
		return maps;
	}

	@RequestMapping("/save")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> save(XxlJobGroup xxlJobGroup){

		// valid
		if (xxlJobGroup.getAppname()==null || xxlJobGroup.getAppname().trim().length()==0) {
			return new ReturnT<String>(500, (I18nUtil.getString("system_please_input")+"AppName") );
		}
		if (xxlJobGroup.getAppname().length()<4 || xxlJobGroup.getAppname().length()>64) {
			return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_appname_length") );
		}
		if (xxlJobGroup.getAppname().contains(">") || xxlJobGroup.getAppname().contains("<")) {
			return new ReturnT<String>(500, "AppName"+I18nUtil.getString("system_unvalid") );
		}
		if (xxlJobGroup.getTitle()==null || xxlJobGroup.getTitle().trim().length()==0) {
			return new ReturnT<String>(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")) );
		}
		if (xxlJobGroup.getTitle().contains(">") || xxlJobGroup.getTitle().contains("<")) {
			return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_title")+I18nUtil.getString("system_unvalid") );
		}
		if (xxlJobGroup.getAddressType()!=0) {
			if (xxlJobGroup.getAddressList()==null || xxlJobGroup.getAddressList().trim().length()==0) {
				return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_addressType_limit") );
			}
			if (xxlJobGroup.getAddressList().contains(">") || xxlJobGroup.getAddressList().contains("<")) {
				return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_registryList")+I18nUtil.getString("system_unvalid") );
			}

			String[] addresss = xxlJobGroup.getAddressList().split(",");
			for (String item: addresss) {
				if (item==null || item.trim().length()==0) {
					return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_registryList_unvalid") );
				}
			}
		}

		// process
		xxlJobGroup.setUpdateTime(new Date());

		int ret = xxlJobGroupDao.save(xxlJobGroup);
		return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;
	}

	@RequestMapping("/update")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> update(XxlJobGroup xxlJobGroup){
		// valid
		if (xxlJobGroup.getAppname()==null || xxlJobGroup.getAppname().trim().length()==0) {
			return new ReturnT<String>(500, (I18nUtil.getString("system_please_input")+"AppName") );
		}
		if (xxlJobGroup.getAppname().length()<4 || xxlJobGroup.getAppname().length()>64) {
			return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_appname_length") );
		}
		if (xxlJobGroup.getTitle()==null || xxlJobGroup.getTitle().trim().length()==0) {
			return new ReturnT<String>(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")) );
		}
		if (xxlJobGroup.getAddressType() == 0) {
			// 0=自动注册
			List<String> registryList = findRegistryByAppName(xxlJobGroup.getAppname());
			String addressListStr = null;
			if (registryList!=null && !registryList.isEmpty()) {
				Collections.sort(registryList);
				addressListStr = "";
				for (String item:registryList) {
					addressListStr += item + ",";
				}
				addressListStr = addressListStr.substring(0, addressListStr.length()-1);
			}
			xxlJobGroup.setAddressList(addressListStr);
		} else {
			// 1=手动录入
			if (xxlJobGroup.getAddressList()==null || xxlJobGroup.getAddressList().trim().length()==0) {
				return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_addressType_limit") );
			}
			String[] addresss = xxlJobGroup.getAddressList().split(",");
			for (String item: addresss) {
				if (item==null || item.trim().length()==0) {
					return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_registryList_unvalid") );
				}
			}
		}

		// process
		xxlJobGroup.setUpdateTime(new Date());

		int ret = xxlJobGroupDao.update(xxlJobGroup);
		return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;
	}

	private List<String> findRegistryByAppName(String appnameParam){
		HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();
		List<XxlJobRegistry> list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT, new Date());
		if (list != null) {
			for (XxlJobRegistry item: list) {
				if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {
					String appname = item.getRegistryKey();
					List<String> registryList = appAddressMap.get(appname);
					if (registryList == null) {
						registryList = new ArrayList<String>();
					}

					if (!registryList.contains(item.getRegistryValue())) {
						registryList.add(item.getRegistryValue());
					}
					appAddressMap.put(appname, registryList);
				}
			}
		}
		return appAddressMap.get(appnameParam);
	}

	@RequestMapping("/remove")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> remove(int id){

		// valid
		int count = xxlJobInfoDao.pageListCount(0, 10, id, -1,  null, null, null);
		if (count > 0) {
			return new ReturnT<String>(500, I18nUtil.getString("jobgroup_del_limit_0") );
		}

		List<XxlJobGroup> allList = xxlJobGroupDao.findAll();
		if (allList.size() == 1) {
			return new ReturnT<String>(500, I18nUtil.getString("jobgroup_del_limit_1") );
		}

		int ret = xxlJobGroupDao.remove(id);
		return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;
	}

	@RequestMapping("/loadById")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<XxlJobGroup> loadById(int id){
		XxlJobGroup jobGroup = xxlJobGroupDao.load(id);
		return jobGroup!=null?new ReturnT<XxlJobGroup>(jobGroup):new ReturnT<XxlJobGroup>(ReturnT.FAIL_CODE, null);
	}


	@RequestMapping("/loadByAppName")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<XxlJobGroup> loadByAppName(@RequestBody Map<String, Object> map) {
		XxlJobGroup jobGroup = xxlJobGroupDao.loadByAppName(map);
		return jobGroup != null ? new ReturnT<XxlJobGroup>(jobGroup)
				: new ReturnT<XxlJobGroup>(ReturnT.FAIL_CODE, null);
	}

	@RequestMapping("/getGroupId")
	@ResponseBody
	@PermissionLimit(limit = false)
	public ReturnT<String> getGroupId(@RequestBody XxlJobGroup jobGroup) {
		XxlJobGroup group = xxlJobGroupDao.findByName(jobGroup.getAppname());
		return new ReturnT<String>(String.valueOf(group.getId()));
	}

}

相应的Dao接口也要新增方法

package com.xxl.job.admin.dao;

import com.xxl.job.admin.core.model.XxlJobGroup;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * Created by xuxueli on 16/9/30.
 */
@Mapper
public interface XxlJobGroupDao {

    public List<XxlJobGroup> findAll();

    public List<XxlJobGroup> findByAddressType(@Param("addressType") int addressType);

    public int save(XxlJobGroup xxlJobGroup);

    public int update(XxlJobGroup xxlJobGroup);

    public int remove(@Param("id") int id);

    public XxlJobGroup load(@Param("id") int id);

    public List<XxlJobGroup> pageList(@Param("offset") int offset,
                                      @Param("pagesize") int pagesize,
                                      @Param("appname") String appname,
                                      @Param("title") String title);

    public int pageListCount(@Param("offset") int offset,
                             @Param("pagesize") int pagesize,
                             @Param("appname") String appname,
                             @Param("title") String title);


    XxlJobGroup loadByAppName(Map<String, Object> map);

    XxlJobGroup findByName(String appname);

}

以及相应的xml文件新增相关代码

<select id="loadByAppName" parameterType="java.util.HashMap" resultMap="XxlJobGroup">
	SELECT
	<include refid="Base_Column_List"/>
	FROM xxl_job_group AS t
	WHERE t.app_name = #{appName}
	</select>


	<select id="findByName" parameterType="java.lang.String" resultMap="XxlJobGroup">
		SELECT <include refid="Base_Column_List" />
		FROM xxl_job_group AS t
		WHERE t.app_name = #{appName}
	</select>

至此,关于调度中心的修改就结束了。

修改自己项目中的文件

首先新增一个XxlUtil工具类

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springblade.modules.zabbix.FnXxljob.entity.XxlJobInfo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@Component
public class XxlJobUtil {

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

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

	private RestTemplate restTemplate = new RestTemplate();

	private static final String ADD_URL = "/jobinfo/addJob";
	private static final String UPDATE_URL = "/jobinfo/updateJob";
	private static final String REMOVE_URL = "/jobinfo/removeJob";
	private static final String PAUSE_URL = "/jobinfo/pauseJob";
	private static final String START_URL = "/jobinfo/startJob";
	private static final String ADD_START_URL = "/jobinfo/addAndStart";
	private static final String GET_GROUP_ID = "/jobgroup/getGroupId";


	public String add(XxlJobInfo jobInfo) {
		// 查询对应groupId:
		Map<String, Object> param = new HashMap<>();
		param.put("appname", appname);
		String json = JSON.toJSONString(param);
		String result = doPost(adminAddresses + GET_GROUP_ID, json);

		JSONObject jsonObject = JSON.parseObject(result);
		String groupId = jsonObject.getString("content");
		jobInfo.setJobGroup(Integer.parseInt(groupId));
		String json2 = JSON.toJSONString(jobInfo);
		return doPost(adminAddresses + ADD_URL, json2);
	}

	public String update(int id, String cron) {
		Map<String, Object> param = new HashMap<>();
		param.put("id", id);
		param.put("jobCron", cron);
		String json = JSON.toJSONString(param);
		return doPost(adminAddresses + UPDATE_URL, json);
	}

	public String remove(int id) {
		Map<String, Object> param = new HashMap<>();
		param.put("id", id);
		String json = JSON.toJSONString(param);
		return doPost(adminAddresses + REMOVE_URL, json);
	}

	public String pause(int id) {
		Map<String, Object> param = new HashMap<>();
		param.put("id", id);
		String json = JSON.toJSONString(param);
		return doPost(adminAddresses + PAUSE_URL, json);
	}

	public String start(int id) {
		Map<String, Object> param = new HashMap<>();
		param.put("id", id);
		String json = JSON.toJSONString(param);
		return doPost(adminAddresses + START_URL, json);
	}

	public String addAndStart(XxlJobInfo jobInfo) {
		Map<String, Object> param = new HashMap<>();
		param.put("appname", appname);
		String json = JSON.toJSONString(param);
		String result = doPost(adminAddresses + GET_GROUP_ID, json);

		JSONObject jsonObject = JSON.parseObject(result);
		String groupId = jsonObject.getString("content");
		jobInfo.setJobGroup(Integer.parseInt(groupId));
		String json2 = JSON.toJSONString(jobInfo);

		return doPost(adminAddresses + ADD_START_URL, json2);
	}

	public String doPost(String url, String json) {
		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.APPLICATION_JSON);
		HttpEntity<String> entity = new HttpEntity<>(json, headers);
		log.info(entity.toString());
		ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity(url, entity, String.class);
		return stringResponseEntity.getBody().toString();
	}

}

我们利用 RestTemplate 来远程调用 xxl-job-admin 中的服务,从而实现动态设置定时任务,而不是局限于通过 xxl-job的admin任务调度界面来设置。

还是写一个测试类

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Date;
 
@Component
@Slf4j
public class TestJob {
	@XxlJob("FnHandler")
	public ReturnT<String> wechatActivityJobHandler(String param) {
		log.info(">>>定时任务开始出发<<<param:{}", param);
		log.info(">>>定时任务开始出发<<<param:{}", param);
		log.info(">>>定时任务开始出发<<<param:{}", param);
		log.info(">>>定时任务开始出发<<<param:{}", param);
		log.info(">>>定时任务开始出发<<<param:{}", param);
		log.info(">>>定时任务开始出发<<<param:{}", param);
		log.info(">>>定时任务开始出发<<<param:{}", param);
 
		return ReturnT.SUCCESS;
	}
}

创建任务并执行

import org.springblade.modules.zabbix.FnXxljob.entity.XxlJobInfo;
import org.springblade.modules.zabbix.FnXxljob.service.XxlService;
import org.springframework.beans.factory.annotation.Autowired;

public class Demo {

	@Autowired
	XxlService xxlService;

	private String Cron = "0/2 * * * * ?";
	
	//新增清除安全日志执行器
	public static void NewXxlJobInfo() {
		XxlJobInfo xxlJobInfo = new XxlJobInfo();
		xxlJobInfo.setJobDesc("定时任务");
		xxlJobInfo.setScheduleType("CRON");
		xxlJobInfo.setScheduleConf(Cron);
		xxlJobInfo.setAuthor("FN");
		xxlJobInfo.setExecutorHandler("FnHandler");
		xxlJobInfo.setExecutorRouteStrategy("FIRST");
		xxlJobInfo.setMisfireStrategy("DO_NOTHING");
		xxlJobInfo.setExecutorBlockStrategy("SERIAL_EXECUTION");
		xxlJobInfo.setGlueType("BEAN");

		xxlService.addAndStartJob(xxlJobInfo);
	}
}

这篇文章就先分享到这里了,感谢浏览到最后,有问题的话,欢迎大家留言。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于使用 Element Plus 的 Vue 表格,你可以通过以下步骤来实现增删操作: 1. 安装 Element Plus:首,确保已经安装了 Vue 和 Element Plus。你可以通过 npm 或者 yarn 来安装它们: ```shell npm install element-plus --save ``` 或者 ```shell yarn add element-plus ``` 2. 引入 Element Plus:在你的 Vue 项目的入口文件(通常是 `main.js`),引入 Element Plus 的样式和组件: ```javascript import { createApp } from 'vue'; import ElementPlus from 'element-plus'; import 'element-plus/lib/theme-chalk/index.css'; const app = createApp(App); app.use(ElementPlus); app.mount('#app'); ``` 3. 创建表格:在你的组件,使用 Element Plus 的 `el-table` 组件来创建表格: ```vue <template> <el-table :data="tableData"> <!-- 表格列 --> </el-table> </template> ``` 4. 定义表格数据:在你的组件的 `data` 定义表格数据,例如: ```javascript export default { data() { return { tableData: [ { name: 'John Doe', age: 25, gender: 'Male' }, { name: 'Jane Smith', age: 30, gender: 'Female' }, // 其他数据行... ] }; } } ``` 5. 实现增删操作:根据你的需求,在组件添加相应的方法来实现增删操作。例如,你可以添加一个按钮来触发添加新行的操作: ```vue <template> <el-table :data="tableData"> <!-- 表格列 --> </el-table> <el-button @click="addRow">添加行</el-button> </template> <script> export default { data() { // 表格数据... }, methods: { addRow() { // 创建一行新数据并添加到表格数据 this.tableData.push({ name: '', age: 0, gender: '' }); }, // 其他操作方法... } } </script> ``` 类似地,你可以添加其他按钮和方法来实现删除行、编辑行等操作。 这只是一个简单的示例,你可以根据你的具体需求来自定义表格和操作。Element Plus 提供了丰富的组件和 API 来帮助你构建功能强大的表格。***

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值