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

 

原文地址:https://www.cnblogs.com/eleven258/p/9686130.html

时间: 2024-08-07 00:14:55

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

java实现定时任务(Quartz)

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

Java Web项目中编写定时任务

之前在的公司有专门的任务调度框架,需要使用的时候引个jar包加个配置和注解就可以使用了,还有专门的平台来维护运行的机器及监控执行状态等等. 现在突然没了这个工具,而又要写定时任务,该怎么办呢? 对于非Web应用来说,我们可以使用Quartz,使用简单,功能强大. 对于Java Web应用来说,当然也可以使用Quartz(有一篇博客介绍了方法:http://blog.csdn.net/sadfishsc/article/details/50808027),但是还有更方便的工具,那就是Spring自

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

原文:ASP.NET Core2.2+Quartz.Net 实现web定时任务 作为一枚后端程序狗,项目实践常遇到定时任务的工作,最容易想到的的思路就是利用Windows计划任务/wndows service程序/Crontab程序等主机方法在主机上部署定时任务程序/脚本. 但是很多时候,若使用的是共享主机或者受控主机,这些主机不允许你私自安装exe程序.Windows服务程序. 码甲会想到在web程序中做定时任务, 目前有两个方向: ①.AspNetCore自带的HostService, 这是

零基础如何系统学习Java Web

零基础如何系统学习Java Web? 我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个月后被辞退了,当然我们还是朋友. 前两个条件都符合了你就可以学了,首先要了解web是什么,一般呢,java web开发无外乎就这么两大类,第一,互联网公司,第二,软件公司.对于互联网公司和软件公司还有一些差别,互联公司是面向广大网民的,会有专门的ui设计,前台开发,后台代码开发,ios开发,androi

spring学习总结(mybatis,事务,测试JUnit4,日志log4j&amp;slf4j,定时任务quartz&amp;spring-task,jetty,Restful-jersey等)

在实战中学习,模仿博客园的部分功能.包括用户的注册,登陆:发表新随笔,阅读随笔:发表评论,以及定时任务等.Entity层设计3张表,分别为user表(用户),essay表(随笔)以及comment表(评论).表结构如下: 项目开发采用Intellij IDEA + maven,整个项目结构如下如下图所示: 在项目的pom.xml文件中,导入项目需要的依赖.pom.xml内容如下所示: 1 <project xmlns="http://maven.apache.org/POM/4.0.0&q

java配置定时任务的几种配置方式及示例

使用java配置定时任务的几种配置方式及示例 (2010-08-21 13:16:10) 转载▼ 标签: spring 定时器 配置 it 分类: java Spring定时器,主要有两种实现方式,包括Java Timer定时和Quartz定时器! 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 package com.land; import java.util.Date;import java.util.TimerTask; public cla

java web使用log4j无法写入到日志文件

项目环境 1.项目类型:java web 2.web容器:tomcat 3.框架:spring 4.调用代码:spring配置的定时任务,任务执行类用@Component注入(开始还以为是这里出了问题 ̄□ ̄||) 主要现象 1.启动tomcat后,发现日志无法写入 2.删除日志文件再次启动,日志文件没有新建 3.单独在类中执行main方法里的log操作可以写入到文件中 4.启动tomcat后,日志可以输入到控制台,但是不能写入到文件中 log4j.properties ####写入到文件!!没反

Servlet监听器与Timer定时器配合实现JAVA WEB应用简单自动作业

在web应用中,有时候客户需要一些定时程序,不需要客户自己去操作,而是由应用程序自行触发执行某些操作.这个时候监听与定时器的配合使用就基本可以实现这个需求了. 1.创建一个监听的SERVELET,这个类继承javax.servlet.http.HttpServlet并且实现javax.servlet.ServletContextListener. [html] view plain copy package com.bndz.outMail; import java.util.Timer; im

LZ从Java Web转大数据,并且成功拿到上市公司Offer,工资直接涨了9K+

Before 本文的目的是为你(有一定编程基础的同学仔)提供一些想打算转大数据的参考: 如果你是大数据工程师,不太适合你进行进阶学习: 如果你是零编程基础同学仔,你可以参考我之前写的blog,建议先把基础打牢,再去学习大数据: 如果你不是攻城狮,那么你可以当做一个故事即可. 大家好,我是Hongten 今天我要给大家分享一下我的个人经历,我从Java Web转大数据,并且成功拿到上市公司Offer,工资直接涨了9K+ 我大二的时候,就开始接触Java,之前也接触了一些Android的知识,但是最