一、提交定时文章,待审核
-
(
ArticleController
—->publishScheduled
)接收参数ScheduledTask4ArticleTo
,里面包含两个属性。 -
ScheduledTaskTo
(定时任务信息):保存发布时间、发布用户id、文章id等信息ArticleSubmitDTO
(文章信息):需要发布的文章具体信息。
-
(
ArticleController
—->publishScheduled
)调用ArticleService
的submitArticle
方法,提交文章,也就是存到数据库中,需要人工审核。 -
(
ArticleController
—->publishScheduled
)保存文章到数据库后,文章有了id,赋值给定时任务中文章id。调用ScheduledTaskFeignClient
的 saveScheduledTask 方法,保存定时任务信息。
二、审核
- (ArticleService —–> auditArticle)如果文章审核通过且为定时发布文章,就把定时任务信息放入 RabbitMQ,并把文章状态设置为定时文章待发布状态。
三、发布定时任务
案例中发现:发布定时任务到xxl-job 服务器中注意用到以下几个参数
public class XxlJobInfoBo {
private int id = 0; // 0
private int jobGroup; // 2
private String jobDesc; //任务名
private String author = "Vanky"; // 负责人
private String scheduleType = "CRON"; // CRON
private String scheduleConf; // cron表达式
private String misfireStrategy = "DO_NOTHING";
private String executorRouteStrategy = "FIRST"; // FIRST
private String executorHandler; // 执行器,任务Handler名称
private String executorBlockStrategy = "SERIAL_EXECUTION"; // SERIAL_EXECUTION
private String glueType = "BEAN"; // BEAN
private String glueRemark = "GLUE代码初始化"; // GLUE代码初始化
}
需要赋值的有:
-
jobGroup
执行任务的组idjobDesc
任务的描述(可不写)scheduleConf
采用cron表达式来表示任务的执行时间executorHandler
执行器,执行任务的具体方法appname
执行任务的服务
-
(
OtherMQService
—->taskSubmitArticleQueue
)MQ 的这个方法中,将定时任务信息转为xxl-job服务器需要的信息。比如把时间格式转为cron
格式,设置任务的执行地址及方法等。 -
(
OtherMQService
—->taskSubmitArticleQueue
)给xxl-job
服务器发请求,添加任务并启动(不是马上执行,是到时间再执行)
自己写了一个工具类(向服务器发请求),这个工具类便于向服务器发一些与任务相关的请求。
- public String add(XxlJobInfo jobInfo,String appName)
- public String update(int id, String cron)
- public String remove(int id)
- public String pause(int id)
- public String start(int id)
- public String addAndStart(XxlJobInfo jobInfo,String appName)
其中addAndStart
方法用于添加任务并启动,这个方法先根据appname
获取组id(必须要的参数),然后再添加任务,并启动。
四、执行定时任务
- 到了执行任务的时间,xxl-job服务器到指定的服务的方法中执行,修改文章发布时间和状态。
@XxlJob("submitArticleScheduled")
public void submitArticleScheduled(){
// 执行发布逻辑
}
附:
还需要配合地 在xxl-job 服务端 写一些接收这些请求的简单逻辑
@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,String appName){
// 查询对应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,String appName){
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);
}
/**
* 用于发送post请求
* @param url
* @param json
* @return
*/
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();
}
}