quartz定时任务使用小记(11月22日)

author author     2022-08-14     299

关键词:

骤然接触quartz,先从小处着手,why,what,how

quartz定时任务:

  为什么使用quartz定时任务,以及定时任务在实际应用场景下的特定需求。

  1.用户方面的需要,为了提供更好的使用体验,例如,针对用户注册的监听,最终得到用户使用一定阶段各种提醒、互动方面的业务使用,以及针对用户生日的监听及定时任务的设置

  2.数据更新的需要,针对公司日终报表的设计,这里就涉及今日的主题,数据库相关存储过程的调用。存储过程是可执行的代码块,效率相对java后台代码效率要高,尤其是针对查询时,选用存储过程做逻辑判断。在12306网站数据管理中,网购车票预留几个小时进行数据的更新,一些专门数据库表数据的填充与更新。

  3.业务方面的需要,这里涉及工作中的实际需求,针对业务层的特定方法给以定时任务设置,尤其是在物流系统中,相关逾期的提醒,金融证券系统中,各种日终的运算等。

  技术分享

  什么是quartz:

  Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。

  Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器、任务和触发器这3个核心的概念,跟精细的描述调度器、任务和触发器,跟精准的完成任务的调度。

  Quartz是一个完全由java编写的开源作业调度框架。核心是调度器,调度器负责管理Quartz应用运行时环境。Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。Quartz依赖一套松耦合的线程池管理部件来管理线程环境,而且Quartz里面的每个对象是可配置的或者是可定制的。

技术分享

  调度器、任务和触发器简介

  ==Job与Trigger是一对一的关系,Scheduler与Trigger是一对多的关系。

  调度器:调度器用于将与作业触发器关联,一个作业可关联多个触发器,这样每个触发器被可以触发的作业执行;一个触发器可用于控制多个作业,触发时全部作业将获得调度。Quartz的调度器由Scheduler接口体现。
  作业:只需实现org.quartz.job接口即可.Job接口包含一个方法 execute(),execute方法体是被调度的作业体。一旦实现Job接口和execute()方法,
  Quartz确定作业运作的时候,它将调用 execute()方法体。
  触发器:有SimpleTrigger和CronTrigger两种类型
    1.每隔指定时间则触发一次,对应的调度器为org.springframework.scheduling.quartz.SimpleTriggerBean
    2.每到指定时间则触发一次,对应的调度器为org.springframework.scheduling.quartz.CronTriggerBean

     技术分享

  案例demo参考:http://blog.csdn.net/wangguanyin98/article/details/50977764

spring与Quartz的整合 

   资源参考:http://stevex.blog.51cto.com/4300375/1351980

   Spring配置调度器 schedule,作业 job,触发器 trigger的实例:

  技术分享

A.实际开发中的应用,applicationContext.xml即spring主配置文件中的配置:

<!-- ************************************定时执行任务区*************************************** -->
<!-- quartz线程池配置 -->
<bean id="executor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="100" />
<property name="queueCapacity" value="500" />
</bean>

<!-- 更新申请状态 -->
<bean id="jdApplyStatusJobTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jdSftpService" />
<property name="targetMethod" value="updateApplyStatus" />
</bean>
<!-- 更新放款状态 -->
<bean id="jdLoanStatusJobTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jdSftpService" />
<property name="targetMethod" value="updateLoanStatus" />
</bean>

<!-- 定时计算罚息 -->
<bean id="payCaculateServiceJobTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="payCaculateService" />
<property name="targetMethod" value="settlementCaculate" />
</bean>

<!-- 设置更新申请状态的触发器 -->
<bean id="jdApplyStatusCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jdApplyStatusJobTask" />
<property name="cronExpression" value="0 25 10 * * ?" />
</bean>

<!-- 设置更新放款状态的触发器 -->
<bean id="jdLoanStatusCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jdLoanStatusJobTask" />
<property name="cronExpression" value="0 25 10 * * ?" />
</bean>

<!-- 设置计算罚息的触发器 -->
<bean id="payCaculateServiceCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="payCaculateServiceJobTask" />
<property name="cronExpression" value="0 41 17 * * ?" />
</bean>

<!-- 发送还款流水Job -->
<bean id="deductServiceJobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="deductService" />
<property name="targetMethod" value="repaymentDetail" />
</bean>

<!-- 还款流水发送Trigger -->
<bean id="deductServiceJobTaskCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="deductServiceJobTask" />
<property name="cronExpression" value="0 12 17 * * ?" />
</bean>


<!-- 调度器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="jdApplyStatusCronTrigger" />
<ref bean="jdLoanStatusCronTrigger" />
<!-- <ref bean="payCaculateServiceCronTrigger" />
<ref bean="deductServiceJobTaskCronTrigger" />-->
</list>
</property>
<property name="taskExecutor" ref="executor" />
</bean>

B.Quartz定时任务,service的编写

@Service("payCaculateService")

public class PayCaculateService {
@Resource(name = "daoSupport")
private DaoSupport dao;
/*
* 根据合同号获取还款流水
*/
public List<PageData> getPayLslistPage(Page page) throws Exception {
return (List<PageData>) dao.findForList("PayCaculateMapper.getPayLslistPage",page);

}
/*
* 入账计算
*/
public String payCaculate(PageData pd) throws Exception {
try {
dao.findForObject("PayCaculateMapper.proPayCaculate",pd);
return "1";
} catch (Exception e) {
e.printStackTrace();
}
return "0";
}
/**
* 结息(罚息)定时计算
* @param pd
* @return
* @throws Exception
*/
public String settlementCaculate() throws Exception {
java.text.DateFormat format2 = new java.text.SimpleDateFormat("yyyy-MM-dd");
String sd= format2.format(new java.util.Date());
PageData pd=new PageData();
pd.put("settlement_date", sd);
dao.findForObject("PayCaculateMapper.settlementCaculate",pd);
return "1";
}

}

C.基于反射机制,对于mapper中制定id的 my sql存储过程的调用

<select id="batchCaculate" statementType="CALLABLE" parameterType="pd" resultType="pd">
<![CDATA[
{call js_batch_repay()}
]]>
</select>

<select id="oneCaculate" statementType="CALLABLE" parameterType="pd" resultType="pd">
<![CDATA[
{call js_one_repay(#{sub_contract_no},#{period})}
]]>
</select>

<select id="settlementCaculate" statementType="CALLABLE" parameterType="pd" resultType="pd">
<![CDATA[
{call js_settlement(#{settlement_date})}
]]>
</select>

技术分享

 


















































































































quartz定时任务时间设置

quartz定时任务时间设置:这些星号由左到右按顺序代表:*******格式:[秒][分][小时][日][月][周][年]通配符说明:*表示所有值.例如:在分的字段上设置"*",表示每一分钟都会触发。?表示不指定值。使用的场景为不需要关... 查看详情

quartz定时任务最小时间是多少

参考技术AQuartz是Jobscheduling(作业调度)领域的一个开源项目,Quartz既可以单独使用也可以跟spring框架整合使用,在实际开发中一般会使用后者。使用Quartz可以开发一个或者多个定时任务,每个定时任务可以单独指定执行的时间... 查看详情

quartz定时任务(代码片段)

Quartz可以用来做什么?Quartz是一个任务调度框架。比如你遇到这样的问题想每月25号,信用卡自动还款想每年4月1日自己给当年暗恋女神发一封匿名贺卡想每隔1小时,备份一下自己的爱情动作片学习笔记到云盘这些问题总结起来... 查看详情

quartz定时任务中常用的cron表达式

一:定时cron的格式,一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。按顺序依次为:1.秒(0~59)2.分钟(0~59)3.小时(0~23)4.天(月(0~31,但是你需要考虑你月的天数)5.月(0~11)6.天(星期)(1~71=SUN或SUN,MON... 查看详情

quartz+tablesaw报表统计

...一个月每天数据的总和。一、定时任务定时任务使用的是Quartz框架。Quartz是什么Quartz是一个开源的作业调度框架,由java编写 查看详情

时区切换导致quartz定时任务没有触发问题

时区切换对Quartz的cron表达式有影响,切换的1小时内停止触发定时任务,导致sla没有定时清空内存计数,误发限流。美国夏令时PST切换到冬令时PDT,会有时间跳变。不带时区跳变的,会出现时间重叠或不连续问题复现mac本机模拟... 查看详情

spring定时任务quartz

spring定时任务quartz背景介绍  使用spring做项目,需要定时的完成一系列的任务动作处理,执行相应的代码逻辑,使用spring的Quartz组件可以完成定时任务的功能,作者强烈推荐使用Quartz2.x版本。原理如下:一、环境介绍  IDE:ec... 查看详情

quartz——定时任务

Quartz之前版本的使用:http://blog.csdn.net/huihuimimi17/article/details/8215779 2之后的版本使用:简单使用packagecom.bxw;importjava.util.Date;importorg.quartz.DateBuilder;importorg.quartz.JobBuilder;importorg.quartz. 查看详情

springboot入门:集成quartz定时任务

...章续《SpringBoot入门(八):集成RabbitMQ消息队列》,关于Quartz定时任务请参考《Quartz的基本使用之入门(2.3.0版本)》springboot实现定时任务,除了集成Quartz外,还可以直接使用scheduler注解。使用1个简单的注解就可以完成,为什... 查看详情

quartz定时任务

Quartz是纯Java开发的工作任务调度框架,可以与各种Java框架配合使用,也可以独立运行。一般在项目中实现定时任务。根据官方的描述Quartz可以支持,一个、多个乃至万个定时任务,个人不太敢这么尝试,如果那么多定时任务的... 查看详情

spring+quartz定时任务,以及修改定时任务

spring4+quartz2.2.3,定时任务弄好了,修改定时任务没折腾起,没找到合适的解决方案。最终使用库spring-context-support 3.2.17.RELEASE+ quartz1.8.0解决,quart1.8.x版本的CronTriggerBean弄起来方便关键代码如下:1.maven文件<dependency><... 查看详情

第三周——例行报告

1、本周PSPC类型C任务S开始时间E结束时间I中断时间?时间(分)准备工作阅读构建之法和博客9月22日17:479月22日18:160:0029编程修改上周代码9月22日18:239月22日22:130:321368修改上周代码9月22日18:239月22日22:130:32修改上周代码9月23日14:589... 查看详情

2018年11月18日atcronb计划任务及添加删除任务

查看详情

quartz实现动态定时任务

...务的执行,而且要求定时周期是不固定的,所以就用到了quartz来实现这个功能;    spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz2.x,不然会出错。至于原因,则是spring对于quartz的支持实现,org... 查看详情

.netcore使用quartz定时任务(代码片段)

这是一个使用.NETCore和Quartz.NET实现定时任务的完整示例。首先确保已经安装了.NETCoreSDK。接下来按照以下步骤创建一个新的控制台应用程序并设置定时任务:创建一个新的.NETCore控制台应用程序:dotnetnewconsole-nQuartzDemocdQuartzDemo通... 查看详情

深入quartz,更优雅地管理你的定时任务(代码片段)

目录初识QuartzQuartz基础使用基于时间间隔的定时任务基于Cron表达式的定时任务Quartz解读JobTriggerSchedulerQuartz进阶使用多触发器的定时任务Job中注入BeanQuartz的持久化最近在工作遇到了定时任务场景,因此特地对定时任务相关知... 查看详情

深入quartz,更优雅地管理你的定时任务(代码片段)

目录初识QuartzQuartz基础使用基于时间间隔的定时任务基于Cron表达式的定时任务Quartz解读JobTriggerSchedulerQuartz进阶使用多触发器的定时任务Job中注入BeanQuartz的持久化最近在工作遇到了定时任务场景,因此特地对定时任务相关知... 查看详情

quartz将定时任务持久化到数据库

...demo是将定时任务的信息保存在内存中的,见以下配置org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore  如果,我们需要在系统意外(或非意外)重新启动后,仍保留定时任务信息,可以使用数据库存储定时任务信息。org.quartz.jobStore.... 查看详情