`
y806839048
  • 浏览: 1121781 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

定时任务项目的设计思路

阅读更多

 

 

 

定时任务项目的设计思路:

 

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);

        }

}

 

 

 

分享到:
评论

相关推荐

    C#实现的自定义定时任务 可定时运行 多任务运行

    下面是一个简单的多任务定时任务调度器的设计思路: ```csharp public class TimingTaskScheduler { private readonly List&lt;TimingTask&gt; _tasks; private readonly System.Threading.Timer _timer; public ...

    Android-TimeTask是一个轻量简洁的定时任务队列框架

    在`BolexLiu-TimeTask-0a80136`这个压缩包中,包含了`TimeTask`框架的源代码,开发者可以通过阅读源码更深入地理解其工作原理和设计思路。此外,示例代码和文档可以帮助快速上手使用。 总之,`Android-TimeTask`...

    dotnet-LightCron是一个使用简单的基于dotnetstandard20的定时任务组件

    这种设计思路使得任务的定义与业务代码紧密相连,减少了额外的配置文件,提高了代码的可读性和可维护性。例如,你可以通过自定义一个类并标记上特定的定时任务Attribute,然后在运行时由Light.Cron自动识别并执行这...

    Java应用多机器部署解决大量定时任务问题

    "Java应用多机器部署解决大量定时任务问题" Java应用多机器部署解决大量定时任务...解决Java应用多机器部署下的大量定时任务问题需要设计和实现分布式系统,并使用数据库的锁机制来确保只有一个机器能够执行定时任务。

    线程池、任务、任务组、任务池,定时任务的类库-hy.common.tpool.zip

    通过对源码的深入学习,我们可以理解其设计思路,掌握如何定制和优化线程池以适应不同的应用场景。 线程池的配置参数,如核心线程数、最大线程数、线程存活时间、工作队列类型等,对线程池的性能有很大影响。合理...

    spring+mybatis maven quartz定时任务管理

    2、设计思路:定义一个定时任务接口,每个定时任务实现该接口,项目启动时获取该接口所有实现类,并保存到数据库形成定时任务信息。项目启动时候加载所有定时任务并启动。 3、管理界面,可是实现定时任务的cron...

    EasyTask定时任务框架 v2.5.1.zip

    《EasyTask定时任务框架 v2.5.1》是一款针对开发者设计的高效、易用的任务调度框架,旨在简化定时任务的开发与管理...通过深入研究其源代码,开发者不仅可以掌握其工作原理,还能借鉴其设计思路,提升自身的编程技能。

    C#定时调用接口小工具.zip

    《C#定时调用接口小工具的深度解析》 C#作为.NET框架的主要编程语言,...源码开放的设计思路使得它具有很高的可扩展性,适合各种定制化的需求。无论是初学者还是经验丰富的开发者,都能从中受益,进一步提升开发效率。

    单片机课程设计 定时闹钟

    6. **实习报告**:完成课程设计后,学生需要撰写详细的实习报告,概述设计思路、硬件选型、软件设计过程、系统调试以及遇到的问题和解决方案。 7. **Proteus仿真**:Proteus是一款强大的电子电路仿真软件,支持51...

    语言程序设计资料:WinForm项目实战(c_)

    下面是WinForm 项目实战中的一些设计思路: * 了解用户需求:在开始开发项目之前,需要了解用户的需求和 expectation。 * 设计界面:在WinForm 项目中,需要设计一个友好的界面,以便用户可以轻松地使用应用程序。 ...

    基于单片机电子打铃器定时控制系统设计与制作.pdf

    设计者需要编写控制程序,使单片机能够正确读取硬件状态,处理用户输入,执行定时任务,并在适当的时候驱动打铃电路。 综上所述,这个基于单片机的电子打铃器定时控制系统结合了硬件电路设计和软件编程,通过科学的...

    watchman:更夫(watchman)是一款可视化的定时任务配置 Web 工具,麻麻不用担心我漏掉任何更新啦!

    简介 更夫(watchman)是一款可视化定时任务配置工具,集成有...设计思路见: 在线 Demo: 默认登录账号:admin 密码:12345 预览 配置定时抓取任务 定时任务编辑页面 配置通知账户(Email) 更新时收到邮件通知 特性

    温度控制系统的定时测量、定时控制、数据记录功能扩展

    - **定时任务设置:** 编写定时器中断服务程序,根据预设的时间点启动温度调节流程。 - **温度调节算法:** 设计合理的温度调节算法,使系统能够在达到目标温度后保持稳定。 #### 四、总体设计思路 在整体设计上...

    基于ssh的任务调度系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+辅导视频).zip

    4. **项目报告文档资料**:这部分包含了项目的设计思路、实施步骤、技术选型、遇到的问题及解决方案等内容。它是项目开发过程的记录,有助于理解和复现项目。 5. **源代码**:源代码是实现任务调度系统的关键,包含...

    定时执行exe或者bat的源码

    这个源码可以作为一个很好的学习实例,帮助初学者掌握如何在Windows环境中创建定时任务。 【描述】:“这是一款自己编写的用于服务器或者单机定时或者设定多少分钟重复执行的小软件和源代码,是用vb编写,是初学者...

    基于单片机的智能定时插座

    讲解文档则会提供更详细的理论背景、设计思路和技术细节,帮助理解项目的实现原理。 五、毕设指导 作为毕业设计项目,这个主题不仅涵盖了电子工程和计算机科学的基础知识,还涉及了实际问题的解决能力。学生通过...

    定时闹钟设计单片机系统课程设计论文.doc

    接下来两天设计单元电路,包括绘制电路图,选择合适的电子元件并详细解释设计思路;第五、六天专注于软件开发,编写程序实现预定功能;第七至第八天在实验室进行硬件调试;最后两三天,完成课程设计报告,确保内容...

    易语言简单实现定时关机源码.zip易语言项目例子源码下载

    易语言是一种基于中文编程的计算机程序设计语言,它旨在降低编程的难度,让不懂英文的用户也能进行软件开发。...在实际应用中,还可以根据需求扩展功能,比如增加定时重启、休眠等功能,或者提供更复杂的定时任务管理。

Global site tag (gtag.js) - Google Analytics