java web定时任务---quartz
写在前面:
前面有简单的记录下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的更多相关文章
- java实现定时任务(Quartz)
java中实现定时任务执行某一业务.具体操作如下: 1.定义初始化任务 2.任务业务操作 3.定义初始化方法 4.在web.xml中注册启动 5.定义具体执行时间 6.quartz定时任务时间设置 q ...
- java web定时任务---Timer
写在前面: 在最近的项目中需要每天定时对数据库表进行查询,并完成相关数据的更新操作.首先让我想到的是Timer类,记得在一开始维护那个老系统的时候,开了个接口,也涉及到了定时的操作.下面就记录下大概的 ...
- 在Java Web项目中添加定时任务
在Java Web程序中加入定时任务,这里介绍两种方式:1.使用监听器注入:2.使用Spring注解@Scheduled注入. 推荐使用第二种形式. 一.使用监听器注入 ①:创建监听器类: impor ...
- ASP.NET Core2.2+Quartz.Net 实现web定时任务
作为一枚后端程序狗,项目实践常遇到定时任务的工作,最容易想到的的思路就是利用Windows计划任务/wndows service程序/Crontab程序等主机方法在主机上部署定时任务程序/脚本. 但是 ...
- Java生鲜电商平台-定时器,定时任务quartz的设计与架构
Java生鲜电商平台-定时器,定时任务quartz的设计与架构 说明:任何业务有时候需要系统在某个定点的时刻执行某些任务,比如:凌晨2点统计昨天的报表,早上6点抽取用户下单的佣金. 对于Java开源生 ...
- java web实现计划定时任务
java web实现定时计划任务 1.定义一个类继承TimerTask,在run方法中写上需要执行的逻辑 package com.mytask; import java.util.TimerTask; ...
- java web SSO单点登录
第一篇: Web应用系统的演化总是从简单到复杂,从单功能到多功能模块再到多子系统方向发展. .当前的大中型Web互联网应用基本都是多系统组成的应用群,由多个web系统协同为用户提供服务. 多系统应用群 ...
- Spring Scheduler定时任务 + Quartz
原文地址: https://blog.csdn.net/revitalizing/article/details/61420556 版权声明:本文为博主原创文章,未经博主允许不得转载. https:/ ...
- java实现定时任务解决方案
在线corn表达式 1. 总结常见的实现定时任务的几种方法 thread实现 [原理:通过创建一个线程,让他在while循环里面一直运行,用sleep() 方法让其休眠从而达到定时任务的效果.] Ti ...
随机推荐
- x:Class, x:Key
x:Class: 用来创建一个partial的class, 比如默认生成的x:Class="MyTest.MainWindow", 会自动生成一个MainWindow的partia ...
- c++ 公有继承的赋值兼容规则
赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代.通过公有继承,派生类得到了基类中除构造函数.析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同.这样,公有派生 ...
- 转:Spring AOP详解
转:Spring AOP详解 一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址: ...
- 转:LVS负载均衡
1.什么是LVS? 首 先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和 基于内容请求分发技术.调度器具 ...
- centos 防火墙关闭/开启
从配置菜单关闭防火墙是不起作用的,索性在安装的时候就不要装防火墙查看防火墙状态:/etc/init.d/iptables status暂时关闭防火墙:/etc/init.d/iptables stop ...
- 汕头市队赛 SRM 06 B 起伏的排名
B 起伏的排名 SRM 06 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂. 在上个星期她打了n场麻将,每场麻将都有n名玩家.KPM自然记得自己的n次排名. ...
- SSM初步整合一
SSM(spring+springmvc+mybatis)初步整合一配置步骤: 步骤一.导入所需jar包 步骤二 .配置web.xml文件 <?xml version="1.0&quo ...
- hdu 2544 最短路 (dijkstra,floyd)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找到两点间最短的距离值. 代码一:(dijkstra算法) #include < ...
- JMeter之定时器的作用域
定时器的作用域 1.定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是下面): 2.当执行一个sampler之前时,所有当前作用域内的定时器都会被执行 ...
- sql参数化防止sql注入导致的暴露数据库问题
#转载请联系 假如你在京东工作,你要做的任务就是做一个商品搜索的东西供用户使用. 然后你写出了这么一个程序的雏形. import pymysql def main(): conn = pymysql. ...