定时任务项目的设计思路:
1, 进程锁
2,任务的启动:(利用spring的@PostConstruct初始化后立即触发)
Parameters: SANXIANG(String)
LoanApplyJob List<LoanApply> list = loanApplyMapper.queryByBankType(bankRisk.getBankType()); --查询不同业务的任务
HttpClientUtil.httpJsonPost(ApiUrls.LOAN_APPLY_URL, JSONObject.toJSON(loanApply).toString());--这些任务发送大这类任务的处理类
请求到TaskLoanApplyController:
loanApplyQueue 异步 自动触发
需要校验
loanApplyQueue -- String result = bankLoanApplyService.loanApply(loanApplyRequest); 进入自己的方法 (数据库配置实例) SanxiangLoanApplyServiceImpl(ioc获取任务中配置
好的处理类)
}
if (!riskLoanApplyService.checkTime(loanApply.getBankType())) {
return ApiResponse.error(CodeEnum.CODE_0040);
}
if (!riskLoanApplyService.checkCountAndAmt(loanApply)) {
return ApiResponse.error(CodeEnum.CODE_0046);
}
loanApply 手动调用用
RefreshController 可替代重启服务--重新加载数据库配置
TaskController 手动添加定时任务
对应配置:
b_bank_conf 待处理业务
b_bank_risk 专门配置定时任务允许的时间 等执行限制
task 大的进件任务
task_param 任务间隔
task_count_param 执行记录
task_timer(公用的非业务的定时任务)
AutoAdminTaskManager 开启调度---查task job表---组装任务 触发器---开启任务
AutoAdminTaskManager 查出任务
@PostConstruct 一在注入完成之后调用此方法,开启定时任务
BaseAdminTaskTimer
TaskTimerJobManager 这里启动
请求和返回参数记录日志
@PostConstruct
public void start() {
try {
System.out.println("*******");
//开启spring容器中的调度器,后续注入的都是已经开启的
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
LOG.info("StdSchedulerFactory >> start");
//开启调度器
scheduler.start();
LOG.info("StdSchedulerFactory >> end");
LOG.info("init clearRedisFlags >> start >> ");
//删除redis锁,每个任务执行前都会加上redis锁
clearRedisFlags();
LOG.info("init clearRedisFlags >> end >> ");
LOG.info("init startTasks >> start >> ");
//开启业务定时任务
startTasks();
LOG.info("init startTasks >> end >> ");
LOG.info("init startTaskTimers >> start >> ");
//开启公共定时任务
startTaskTimers();
LOG.info("init startTaskTimers >> end >> ");
LOG.info("init autoRefresh >> start >> ");
/*if (autoRefreshInterval < 30000 || autoRefreshInterval > 86400000) {
LOG.error("autoRefreshInterval to configure failed, it is lower than 30000 millisecond or higher than 86400000 millisecond");
autoRefreshInterval = 3000000;
}*/
baseTaskTimer.initData();
Runtime.getRuntime().addShutdownHook(new TaskShutdownHook(scheduler, redisService));
LOG.info("init autoRefresh >> end >> ");
} catch (Exception e) {
e.printStackTrace();
LOG.error("StdSchedulerFactory is exception >> " + e);
}
}
获取task任务表中的任务(每种业务一个大任务)
private void startTasks() {
LOG.info("AutoTaskListener >> list >> start3");
List<Task> list = taskTimerService.getTaskTimerByStatus(TaskStatus.RUNNING.getCode());
LOG.info("AutoTaskListener >> list >> end" + list);
for (Task taskTimer : list) {
baseTaskTimer.startTaskById(taskTimer);
}
}
/**
* 开始任务 根据配置好的实例id获取对应实例的对象-----job
*/
public void startTaskById(Task taskTimer) {
try {
LOG.info("startTaskById taskTimer >> " + taskTimer);
BaseJob job = (BaseJob) BaseBeanFactory.getBean(taskTimer.getTaskClass());
LOG.info("startTaskById job >> " + job);
if (null != job) {
job.reSet();
}
baseTaskTimerService.startTask(taskTimer, job);
} catch (Exception e) {
e.printStackTrace();
}
}
有了job之后组装trigger开始调度
@Override
public void startTask(Task taskTimer, BaseJob job) {
try {
if (taskTimer.getTaskType().equals(TaskType.FIX_DELAY.getCode())) { // 非定时任务
// 获取时间
Long delayDate = job.getDelayDate(JobConstants.AUTO_TASK_DELAY_DATE_KEY);
Long intervalDate = job.getIntervalDate(JobConstants.AUTO_TASK_INTERVAL_DATE_KEY);
JobDetail jobDetail = JobBuilder.newJob(job.getClass())
.withIdentity(taskTimer.getTaskClass(), Scheduler.DEFAULT_GROUP).build();
// 创建Trigger
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(intervalDate + "_" + taskTimer.getTaskClass(), Scheduler.DEFAULT_GROUP)
.startAt(new Date(new Date().getTime() + delayDate))
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMilliseconds(intervalDate).repeatForever()).build();
scheduler.scheduleJob(jobDetail, trigger);
LOG.info("已调度非定时任务" + taskTimer.getTaskClass());
} else { // 定时任务
// 获取该任务的所有执行时间
List<TimingDate> timingDates = job.getTimingDates(JobConstants.AUTO_TASK_TIMING_DATE_KEY);
if (null != timingDates && timingDates.size() > 0) {
// 创建 JobDetail
JobDetail jobDetail = JobBuilder.newJob(job.getClass()).withIdentity(taskTimer.getTaskClass(), Scheduler.DEFAULT_GROUP).storeDurably(true).build();
scheduler.addJob(jobDetail, false);
LOG.info("timingDates >> " + timingDates);
for (TimingDate timingDate : timingDates) {
Trigger trigger = null;
// 没有天 只有小时和分钟
if (timingDate.getDays() == 0) {
trigger = TriggerBuilder.newTrigger().forJob(jobDetail)
.withIdentity(timingDate.getHour() + "_" + timingDate.getMin() + "_" + taskTimer.getTaskClass(), Scheduler.DEFAULT_GROUP)
.withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(timingDate.getHour(),timingDate.getMin())).build();
} else {
trigger = TriggerBuilder.newTrigger().forJob(jobDetail)
.withIdentity(timingDate.getHour() + "_" + timingDate.getMin() + "_" + taskTimer.getTaskClass(), Scheduler.DEFAULT_GROUP)
.withSchedule(CronScheduleBuilder.monthlyOnDayAndHourAndMinute(timingDate.getDays(),timingDate.getHour(), timingDate.getMin())).build();
}
if (null != trigger) {
scheduler.scheduleJob(trigger);
LOG.info("已调度定时任务 >> " + timingDates + taskTimer.getTaskClass());
}
}
LOG.info("已调度定时任务 >> " + timingDates + taskTimer.getTaskClass());
} else {
return;
}
}
} catch (Exception e) {
e.printStackTrace();
LOG.error("调度定时任务异常 >> " + taskTimer + " >> job >> " + job);
}
}
LoanApplyJob 具体的job类中用配置好的实例id获取要执行额具体服务
注意:
定时:
task_timer 公共的定时任务---注意 RUNNING
b_bank_conf 进件的定时任务-----注意 b_bank_risk也需要配置----配置有改动需要重启 task(大任务,RUNNING) 结合 task_param(执行时间间隔)
任务补偿:先是配置好自动发请求 一次失败之后会手动调用一个方法触发定时任务发请求跑指定次数(定时任务的补偿机制---还是没成功人工看任务的状态)
public void notify(LoanInfo loanInfo) throws Exception {
if (StringUtils.isNotBlank(loanInfo.getNotifyUrl())) {
//调用bank-task回调
String taskParams = MessageFormat.format(loanNotifyParam, loanInfo.getNotifyUrl(), JSONObject.toJSONString(getLoanResInfo(loanInfo)));
String[] p = taskParams.split("\\|");
TaskParam taskParam = new TaskParam();
taskParam.setTaskUrl(p[0]);
taskParam.setWaitingTime(p[1]);
taskParam.setPeriod(p[2]);
taskParam.setPartDelay(p[3]);
taskParam.setPartCount(p[4]);
taskParam.setExecutionCount(p[5]);
taskParam.setArgs(p[7]);
taskParam.setSuccessCdn(p[11]);
taskParam.setHttpType(p[15]);
sendTaskUtil.sendTask(taskParam);
}
}
相关推荐
下面是一个简单的多任务定时任务调度器的设计思路: ```csharp public class TimingTaskScheduler { private readonly List<TimingTask> _tasks; private readonly System.Threading.Timer _timer; public ...
在`BolexLiu-TimeTask-0a80136`这个压缩包中,包含了`TimeTask`框架的源代码,开发者可以通过阅读源码更深入地理解其工作原理和设计思路。此外,示例代码和文档可以帮助快速上手使用。 总之,`Android-TimeTask`...
这种设计思路使得任务的定义与业务代码紧密相连,减少了额外的配置文件,提高了代码的可读性和可维护性。例如,你可以通过自定义一个类并标记上特定的定时任务Attribute,然后在运行时由Light.Cron自动识别并执行这...
"Java应用多机器部署解决大量定时任务问题" Java应用多机器部署解决大量定时任务...解决Java应用多机器部署下的大量定时任务问题需要设计和实现分布式系统,并使用数据库的锁机制来确保只有一个机器能够执行定时任务。
通过对源码的深入学习,我们可以理解其设计思路,掌握如何定制和优化线程池以适应不同的应用场景。 线程池的配置参数,如核心线程数、最大线程数、线程存活时间、工作队列类型等,对线程池的性能有很大影响。合理...
2、设计思路:定义一个定时任务接口,每个定时任务实现该接口,项目启动时获取该接口所有实现类,并保存到数据库形成定时任务信息。项目启动时候加载所有定时任务并启动。 3、管理界面,可是实现定时任务的cron...
《EasyTask定时任务框架 v2.5.1》是一款针对开发者设计的高效、易用的任务调度框架,旨在简化定时任务的开发与管理...通过深入研究其源代码,开发者不仅可以掌握其工作原理,还能借鉴其设计思路,提升自身的编程技能。
《C#定时调用接口小工具的深度解析》 C#作为.NET框架的主要编程语言,...源码开放的设计思路使得它具有很高的可扩展性,适合各种定制化的需求。无论是初学者还是经验丰富的开发者,都能从中受益,进一步提升开发效率。
6. **实习报告**:完成课程设计后,学生需要撰写详细的实习报告,概述设计思路、硬件选型、软件设计过程、系统调试以及遇到的问题和解决方案。 7. **Proteus仿真**:Proteus是一款强大的电子电路仿真软件,支持51...
下面是WinForm 项目实战中的一些设计思路: * 了解用户需求:在开始开发项目之前,需要了解用户的需求和 expectation。 * 设计界面:在WinForm 项目中,需要设计一个友好的界面,以便用户可以轻松地使用应用程序。 ...
设计者需要编写控制程序,使单片机能够正确读取硬件状态,处理用户输入,执行定时任务,并在适当的时候驱动打铃电路。 综上所述,这个基于单片机的电子打铃器定时控制系统结合了硬件电路设计和软件编程,通过科学的...
简介 更夫(watchman)是一款可视化定时任务配置工具,集成有...设计思路见: 在线 Demo: 默认登录账号:admin 密码:12345 预览 配置定时抓取任务 定时任务编辑页面 配置通知账户(Email) 更新时收到邮件通知 特性
- **定时任务设置:** 编写定时器中断服务程序,根据预设的时间点启动温度调节流程。 - **温度调节算法:** 设计合理的温度调节算法,使系统能够在达到目标温度后保持稳定。 #### 四、总体设计思路 在整体设计上...
4. **项目报告文档资料**:这部分包含了项目的设计思路、实施步骤、技术选型、遇到的问题及解决方案等内容。它是项目开发过程的记录,有助于理解和复现项目。 5. **源代码**:源代码是实现任务调度系统的关键,包含...
这个源码可以作为一个很好的学习实例,帮助初学者掌握如何在Windows环境中创建定时任务。 【描述】:“这是一款自己编写的用于服务器或者单机定时或者设定多少分钟重复执行的小软件和源代码,是用vb编写,是初学者...
讲解文档则会提供更详细的理论背景、设计思路和技术细节,帮助理解项目的实现原理。 五、毕设指导 作为毕业设计项目,这个主题不仅涵盖了电子工程和计算机科学的基础知识,还涉及了实际问题的解决能力。学生通过...
接下来两天设计单元电路,包括绘制电路图,选择合适的电子元件并详细解释设计思路;第五、六天专注于软件开发,编写程序实现预定功能;第七至第八天在实验室进行硬件调试;最后两三天,完成课程设计报告,确保内容...
易语言是一种基于中文编程的计算机程序设计语言,它旨在降低编程的难度,让不懂英文的用户也能进行软件开发。...在实际应用中,还可以根据需求扩展功能,比如增加定时重启、休眠等功能,或者提供更复杂的定时任务管理。