写在前面:

  前面有简单的记录下Timer定时的用法,但是在此次项目中,选择的是quartz来完成定时操作任务的。两者都可以完成定时操作,但是spring可以整合quartz,并且配置起来也比较简便,还可以同时跑多个任务。就选择了quartz,quartz的用法也很强大,这里也是简单的记录下。

  第一步还是需要写自己的任务类,如果有涉及到对数据库的增删改查操作,就按照正常的action,service ,dao的三层来编写方法就好,只不过现在不是通过页面发送请求来调用action,而是通过quartz的定时来调用action操作。

  1.编写自己的任务类:

@Controller("TimerTask")
public class TimerTask {
@Resource
private ProjectWorkItemAssignmentService projectWorkItemAssignmentService; /**
* 每天12:00去自动暂停ProjectWorkItemAssignment表中在执行的workItem
* 以及去自动暂停WorkHoursRecord表中当天在执行的workItem
*/
public void autoPauseWorkItemOne() throws Exception{
projectWorkItemAssignmentService.autoPauseWorkItemOne();
} /**
* 每天13:30去自动开启ProjectWorkItemAssignment表中在执行的workItem
* 以及去自动开启WorkHoursRecord表中当天在执行的workItem
*/
public void autoStartWorkItem() throws Exception{
projectWorkItemAssignmentService.autoStartWorkItem();
} /**
* 每天17:30去自动暂停ProjectWorkItemAssignment表中在执行的workItem
* 以及去自动暂停WorkHoursRecord表中当天在执行的workItem
*/
public void autoPauseWorkItemTwo() throws Exception{
projectWorkItemAssignmentService.autoPauseWorkItemTwo();
} }

  这里的任务类,我是当做action来写的,然后里面的业务方法,根据自己的需求来即可,这里只是简单的列举一下子,后面对应的service,dao的业务就不具体上代码了

  2.编写配置文件,这里我用到的是使用配置文件的形式来配置程序执行的周期以及频率的(可以使用代码的,自己下去查阅资料),由于spring可以整合quartz,还是挺方便的。

我们可以把quartz的配置写在applicationContext.xml文件里面,也可以单独拿出来写一个,然后导入到applicationContext.xml文件中。这里就单独写一个文件。

  applicationContext-quartz.xml(这里我自己配置了三个定时任务,可以根据自己的需要去开启配置)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="TimerTask" /> <!-- 配置调度的定时任务 -->
<property name="targetMethod" value="autoPauseWorkItemOne" /> <!-- 配置调度定时任务中的方法 -->
<property name="concurrent" value="false" /> <!-- 是否并发执行 -->
</bean> <bean id="jobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="TimerTask" /> <!-- 配置调度的定时任务 -->
<property name="targetMethod" value="autoStartWorkItem" /> <!-- 配置调度定时任务中的方法 -->
<property name="concurrent" value="false" /> <!-- 是否并发执行 -->
</bean> <bean id="jobDetail3" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="TimerTask" /> <!-- 配置调度的定时任务 -->
<property name="targetMethod" value="autoPauseWorkItemTwo" /> <!-- 配置调度定时任务中的方法 -->
<property name="concurrent" value="false" /> <!-- 是否并发执行 -->
</bean> <!-- 触发器 配置定时任务的调度的时间 -->
<bean id="workItemTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression">
<value>0 0 12 * * ? </value><!-- [秒] [分] [时] [日] [月] [年] 每天12点触发-->
</property>
</bean> <bean id="workItemTrigger2" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail2" />
<property name="cronExpression">
<value>0 30 13 * * ? </value><!-- [秒] [分] [时] [日] [月] [年] 每天13:30点触发-->
</property>
</bean> <bean id="workItemTrigger3" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail3" />
<property name="cronExpression">
<value>0 30 17 * * ? </value><!-- [秒] [分] [时] [日] [月] [年] 每天17:30点触发-->
</property>
</bean> <!--定义调度器 --><!-- lazy-init='false'容器启动就会执行调度程序 autowire="no"-->
<bean id="workItemscheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" autowire="no">
<property name="triggers">
<list>
<ref bean="workItemTrigger" />
<ref bean="workItemTrigger2" />
<ref bean="workItemTrigger3" />
</list>
</property>
</bean> </beans>

  记得在spring的配置文件中加入quartz的配置文件

  applicationContext.xml:

<import resource="classpath:configs/applicationContext-quartz.xml"/>

  对于调用任务类有两种方式,(使用JobDetailBean来调用某个类,)这里我用的是直接执行某个类的哪一个方法,比较方便。

  其实在刚开始编写的过程中也遇到各种问题,下面也简单的记录下。

  当任务类是service层的类时,无法使用getCurrentSession()来获取session,程序不报错,直接卡在那里。然后是可以使用openSession()来重新打开一个session的,但是对于增删改,每次都需要自己手动进行session的关闭以及事务的提交,不是很方便。当时一直没有找到问题所在,为什么不可以使用getCurrentSession,虽然quartz是新开了一个线程,但是getCurrentSession()不是获取当前线程的session,如果没有就重新开一个么?为什么获取不到呢?很是郁闷.......后来考虑到了是不是项目配置的session的生命周期有影响,因为项目延长了session的生命周期,如下:

<!-- 配置Spring的OpenSessionInViewFilter,以解决懒加载问题  -->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>

决定还是按照规矩来,不要把service层的类直接当任务类去调用,而是改用任务类为action,哇咔咔咔,竟然成功了,可以使用getCurrentSession来获取session了,真的是折磨.....

  所以写代码还是要多多试试,多多实践下,然后在试的过程中一不小心就会给你大大的惊喜!!!

  虽然记录的很简单,但是总比不记录的要好,恩就这样安慰自己,这个样子也是很好的............................ 

  补充一下一个获取sessionFactory的方式:

WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
SessionFactory factory=wac.getBean(SessionFactory.class);
Session session=factory.openSession();

  在遇到问题的过程中也查阅了很多资料,https://blog.csdn.net/davaid_lee/article/details/44588577

 

java web定时任务---quartz的更多相关文章

  1. java实现定时任务(Quartz)

    java中实现定时任务执行某一业务.具体操作如下: 1.定义初始化任务 2.任务业务操作 3.定义初始化方法 4.在web.xml中注册启动 5.定义具体执行时间 6.quartz定时任务时间设置 q ...

  2. java web定时任务---Timer

    写在前面: 在最近的项目中需要每天定时对数据库表进行查询,并完成相关数据的更新操作.首先让我想到的是Timer类,记得在一开始维护那个老系统的时候,开了个接口,也涉及到了定时的操作.下面就记录下大概的 ...

  3. 在Java Web项目中添加定时任务

    在Java Web程序中加入定时任务,这里介绍两种方式:1.使用监听器注入:2.使用Spring注解@Scheduled注入. 推荐使用第二种形式. 一.使用监听器注入 ①:创建监听器类: impor ...

  4. ASP.NET Core2.2+Quartz.Net 实现web定时任务

    作为一枚后端程序狗,项目实践常遇到定时任务的工作,最容易想到的的思路就是利用Windows计划任务/wndows service程序/Crontab程序等主机方法在主机上部署定时任务程序/脚本. 但是 ...

  5. Java生鲜电商平台-定时器,定时任务quartz的设计与架构

    Java生鲜电商平台-定时器,定时任务quartz的设计与架构 说明:任何业务有时候需要系统在某个定点的时刻执行某些任务,比如:凌晨2点统计昨天的报表,早上6点抽取用户下单的佣金. 对于Java开源生 ...

  6. java web实现计划定时任务

    java web实现定时计划任务 1.定义一个类继承TimerTask,在run方法中写上需要执行的逻辑 package com.mytask; import java.util.TimerTask; ...

  7. java web SSO单点登录

    第一篇: Web应用系统的演化总是从简单到复杂,从单功能到多功能模块再到多子系统方向发展. .当前的大中型Web互联网应用基本都是多系统组成的应用群,由多个web系统协同为用户提供服务. 多系统应用群 ...

  8. Spring Scheduler定时任务 + Quartz

    原文地址: https://blog.csdn.net/revitalizing/article/details/61420556 版权声明:本文为博主原创文章,未经博主允许不得转载. https:/ ...

  9. java实现定时任务解决方案

    在线corn表达式 1. 总结常见的实现定时任务的几种方法 thread实现 [原理:通过创建一个线程,让他在while循环里面一直运行,用sleep() 方法让其休眠从而达到定时任务的效果.] Ti ...

随机推荐

  1. git上传本地项目

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...

  2. Sencha Touch MVC 中 store 的使用

    I have a UserStore that I want to load after succesful login of a user. I can't get this to work i.e ...

  3. [Evernote]印象笔记使用经验技巧

    一    软件使用      现在使用Windows客户端的印象笔记 + iPhone移动端印象笔记 + chrome浏览器剪藏插件.      在试用了很多云笔记后,还是选择了印象笔记,并且有许多的 ...

  4. bzoj4302 Hdu 5301 Buildings

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4302 [题解] 出自2015多校-学军 题意大概是给出一个n*m的格子有一个格子(x,y)是 ...

  5. [BZOJ2946] [Poi2000]公共串解题报告|后缀数组

    给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 单词个数<=5,每个单词长度<=2000     尽管最近在学的是SAM...但是看到这个题还是忍不住想写SA... (其实是不 ...

  6. thinkphp 导入微信小程序加密解密库

    第三方类库 第三方类库指除了 ThinkPHP 框架.应用项目类库之外的其他类库,一般由第三方系统或产品提供,如 Smarty.Zend 等系统的类库等. 前面使用自动加载或 import 方法导入的 ...

  7. Ansible在节点间传输文件

    1. 在控制节点(the control machine )与远程节点( the current remote host)之间传输文件 1.1 如果需要传输文件,可以使用copy模块,注意copy模块 ...

  8. Django-models class Meta:元类

    Django模型之Meta选项详解 Model 元数据就是 "不是一个字段的任何数据" -- 比如排序选项, admin 选项等等.   Django模型类的Meta是一个内部类, ...

  9. python3 进程_multiprocessing模块

    '''多进程优点:可以利用多核,实现并行运算缺点:1.开销太大: 2.通信困难使用方式跟开多线程一样''' 多进程 import multiprocessing import time,os def ...

  10. 最新Python异步编程详解

    我们都知道对于I/O相关的程序来说,异步编程可以大幅度的提高系统的吞吐量,因为在某个I/O操作的读写过程中,系统可以先去处理其它的操作(通常是其它的I/O操作),那么Python中是如何实现异步编程的 ...