骤然接触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定时任务使用小记(11月22日)的更多相关文章

  1. 2016年11月22日 星期二 --出埃及记 Exodus 20:13

    2016年11月22日 星期二 --出埃及记 Exodus 20:13 "You shall not murder.不可杀人.

  2. 北京Uber优步司机奖励政策(11月16日~11月22日)

    用户组:人民优步“关羽组”(适用于11月16日-11月22日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/ ...

  3. 2018年11月22日 字典 E18灯翼平整度 D&G is SB

    如果创建的东西需要增加修改的,则用list 如果不能修改就用元祖,如果需要修改这需要转成list 字典 字典的value是任意值 info= {"k1":'v1',"k2 ...

  4. Python 爬虫练习(二)爬取补天公益SRC厂商域名URL (2017年11月22日)

    介绍下: 补天是国内知名的漏洞响应平台,旨在企业和白帽子共赢. 白帽子在这里提交厂商漏洞,获得库币和荣誉,厂商从这里发布众测.获取漏洞报告和修复建议. 在2017年3月份之前,补天的厂商域名URL是非 ...

  5. 2016年11月6日 星期日 --出埃及记 Exodus 19:22

    2016年11月6日 星期日 --出埃及记 Exodus 19:22 Even the priests, who approach the LORD, must consecrate themselv ...

  6. Autodesk 最新开发技术研讨会 -8月22日-Autodesk北京办公室

    为了增进与广大中国地区Autodesk产品的二次开发人员的了解与互动,帮助中国地区的Autodesk产品二次开发人员了解Autodesk最新的二次开发技术动向,并获得Autodesk公司专业开发支持顾 ...

  7. 微软SQL Server认证最新信息(17年5月22日更新),感兴趣的进来看看哟

    之前一直有在关注微软认证的一些消息,由于最新的SQL Server认证加入了2016的相关内容,导致课程资料需要大部分更新,但是微软更新相对比较慢,并且经常改版,目前发现的最新的MCP Cert Pa ...

  8. 北京Uber优步司机奖励政策(11月23日~11月29日)

    用户组:人民优步"关羽组"(适用于11月23日-11月29日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最 ...

  9. 北京Uber优步司机奖励政策(11月9日~11月15日)

    用户组:人民优步“关羽组”(适用于11月9日-11月15日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月 ...

随机推荐

  1. ASPNET5中的那些K

    ASPNET5中的那些K ASP.NET 5最大的变化是什么?首当其冲的就是多了很多K,K表示的是ASP.NET vNext的项目代号“Project K”,但很容易让人想到一个汉字——“坑”,希望K ...

  2. iPhone 6出现后,如何将一份设计稿支持多个尺寸?

    http://mp.weixin.qq.com/s?__biz=MzA4NTQzNTMwOA==&mid=201174413&idx=3&sn=c3fe5b3459bac288 ...

  3. SSH-KeyGen 的用法 【转载】

    SSH-KeyGen 的用法 secureCrt通过密钥登录 做法:1.登录A机器 2.ssh-keygen -t [rsa|dsa],将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或 ...

  4. SpringMVC项目接入Springfox实战遇到的问题集合

    为了方便的管理项目中API接口,目前总是会写好接口后,然后又要去维护一个文档,这对于开发者来说太心累了, 在网上找了好多关于API接口管理和生成文档的资料,一次偶然跟51的大神交流发现了Swagger ...

  5. java +bootstrap table 完整例子

    需求:现在常用的table 插件很多, 比如 jquey datatables ,不过操作挺 麻烦, 看到推荐的bootstrap 自带的 table,就用到项目来,先看效果:

  6. asp.net mvc 两级分类联动方法示例

    前台视图代码 <%:Html.DropDownList("AwardClassMainID","请选择")%> <%:Html.DropDow ...

  7. Centos安装成功mysql-5.5.37

    摘自http://www.2cto.com/os/201404/296364.html(原文请关注) 这几天在centos下装mysql,这里记录一下安装的过程,方便以后查阅 Mysql5.5.37安 ...

  8. [D3] 13. Cleaner D3 code with selection.call()

    selection.call() method in D3 can aid in code organization and flexibility by eliminating the need t ...

  9. 通过源码看android系列之AsyncTask

    整天用AsyncTask,但它的内部原理一直没有特意去研究,今天趁着有时间,码下它的原理. 具体用法就不再说明,相信大家已经用得很熟练了,我们今天就从它怎么运行开始说.先新建好我们的AsyncTask ...

  10. RAID 2.0

      传统的RAID 1.0: 选几个硬盘—>做成RAID 5—>根据容量创建LUN—>映射给主机 1.重建时间随单盘容量的增大而迅速增加 2.性能上,一个LUN的读写只能在一个磁盘组 ...