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

骤然接触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>

时间: 2025-01-17 09:07:59

Quartz定时任务使用小记(11月22日)的相关文章

43_2013年11月22日 线程池 Socket(Thread Lock Process 摇奖 线程池ThreadPool)

1>模拟线程池,生产者消费者问题 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Product { class Program { static void Main(string[] args) { //创建一个池子 MyConncetion[]

2018年11月22日 元祖2 E18灯翼平整度

如果创建的东西需要增加修改的,则用list 如果不能修改就用元祖,如果需要修改这需要转成list 字典 字典的value是任意值 info= {"k1":'v1',"k2":"v2"} # 用逗号分隔,分隔成 键值对 #dict 类 注意用{} 大括号 info={ "k1":18, "k2":True, 1:[11,22,33], True:(2,3,4), (1,2,3):"abc"

11月22日 网页项目遇到知识

opacity:0.5;-moz-opacity:0.5;filter:alpha(opacity=50) 透明,border-radius:5px; 圆角,插入视频<video src="" controls="controls" autoplay="autoplay"/video>视频中controls="controls", 是可以控制进度条,autoplay="autoplay"是自动播

11月22日

当前任务 stiffness matrix 究竟怎么算? 什么是tangent stiffnes matrix? 在Exact Corotational Linear FEM Stiffness Matrix之中 linear stiffness matrix     Krest    是指小变形的情形下,节点的力f = Krest * 节点位移x tangent stiffness matrix K = df / dx 定义为f对位移x的雅可比矩阵,表示当前位置下,微小变形与节点力的关系,当元

11月22日 / 周三 Diary

今天完成的事情 完成了 task 1 中的大部分内容 了解了 盒子模型 ( margin, padding, padding, width, height 的含义) 了解了 浮动 (float) 以及浮动换行的方法, 虽然最后没有用到 <div style="clear:both"></div> 资料地址: https://www.cnblogs.com/mq0036/p/4604443.html 学会了 添加颜色 , 添加圆角 background: oran

9月22日全球域名商(国际域名)解析新增保有量TOP20

IDC评述网(idcps.com)09月28日报道:根据DailyChanges公布的最新数据显示,在2015年9月22日,全球域名解析新增保有量二十强榜单中,中国占据4个席位.其中,中国万网.易名中国分获冠亚军,排名环比上期无变化,新增保有量依次达到13,848个.11,327个.下面,请看IDC评述网整理的具体数据情况. (图1)全球域名解析商(国际域名)新增保有量TOP20分布图 通过图1,可了解到在9月22日,中国万网.易名中国的域名解析新增保有量均超过1万,排名稳居前二.接下来,依次是

武汉最新限购政策(2016年12月22日起)

21日晚,武汉市房管局下发通知,扩大武汉市住宅限购范围.除7个中心城区.东湖生态风景区.武汉经济开发区(不含汉南区).武汉东湖新技术开发区外,限购范围新增东西湖区.江夏区.黄陂区部分区域,具体范围:东西湖区金银湖.金银潭.吴家山片(京珠高速以东.沪蓉高速以南.府河及宏图路以西):江夏区纸坊.庙山.大桥.藏龙岛片(江夏区107国道以东,沪蓉高速以北):黄陂区盘龙城片(武汉外环绕城高速以东.后湖以南.岱黄高速公路以西.府河以北). 在限购区域内,武汉本市户籍居民购买二套房最低首付款比例为50%,禁止

11月7日全球域名商保有量及市场份额排行榜TOP16

IDC评述网(idcps.com)11月10日报道:根据RegistrarStats公布的实时数据显示,截止至2015年11月7日,全球域名注册保有量十六强排名顺序,对比上期10月31日,发生明显变化.易名中国上升3位排名11,域名保有量达到2,344,178个,月净增1,100,767个,增势强劲.接下来,IDC评述网将对相关数据进行详尽分析. (图1)全球域名注册商(国际域名)保有量市场份额TOP16 观察图1,可获悉截止至2015年11月7日,全球域名注册保有量市场份额十六强大战中,GOD

[NOIP集训]10月22日

今天的文件夹:10月22日.zip 并查集.哈希表是很有意思的算法,不过更好的是,今天的题我以前都A掉了~ T1:这题最省事的是用STL库的map,然后并查集水过.当然用自己写的Hash函数通过也没有压力. T2:注意这题不要想复杂了,题中的判断规则只有一层,没必要考虑“敌人的敌人的朋友的敌人的朋友的敌人的敌人”这类情况,直接大暴力.数据结构采用并查集,先合并朋友,然后将敌人关系存为一张图,对图中的每个点,把它的所有敌人两两合并.最后输出集合个数. T3:按顺序打击不好处理,我们倒过来看,相当于