java定时任务怎么实现,java定时执行某个方法
如何解决写爬虫IP受阻的问题?立即使用。
本教程运行环境:windows7系统,java8版本8,DELL G3电脑。
最近,在项目开发中需要执行一些预定的任务。比如每天早上要分析前一天的日志信息,借此机会整理出几种实现预定任务的方法。因为项目采用的是spring框架,所以我结合spring框架来介绍一下。
:
一分类
从实现的技术上来分类,目前主要有三种技术(或者说有三种产品):
1.Java自己的java.util.Timer类,它允许您调度java.util.TimerTask任务。这样,你的程序可以按一定的频率执行,但不能在指定的时间执行。一般用的比较少,本文就不详细介绍了。
2.使用Quartz,它是一个强大的调度程序。它可以让你的程序在指定的时间或特定的频率被执行。配置稍微复杂一点,后面会详细介绍。
3.Spring3.0以后自带的任务可以算是一个轻量级的Quartz,使用起来比Quartz简单很多,后面会介绍。
:
从作业类的继承方式来讲,可以分为两类:
1.作业类需要从特定的作业类基类继承,比如quartz中的org . spring framework . scheduling . Quartz . Quartz jobbean;Java.util.Timer需要从java.util.TimerTask继承
2.Job类是一个普通的java类,不需要从任何基类继承。
注意:个人推荐使用第二种方法,因为所有的类都是普通的,不需要提前区别对待。
:
从任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种:
1.它将在每个指定的时间被触发。在Quartz中,对应的触发器是:org . spring framework . scheduling . Quartz . simple rigger bean。
2.它将在指定的时间触发一次。在Quartz中,对应的调度器是:org . spring framework . scheduling . Quartz . crontriggerbean。
注意:不是每个任务都可以使用这两个触发器。例如,java.util.TimerTask任务只能使用第一个。Quartz和spring任务都可以支持这两种触发条件。
二用法说明
详细描述了如何使用各个任务调度工具,包括Quartz和spring task。
Quartz
第一种,作业类继承自特定的基类:org.springframework.scheduling.quartz.QuartzJobBean。
第一步:定义作业类
导入org . quartz . jobexecutioncontext;
import org . quartz . jobexecutionexception;
导入org . spring framework . scheduling . quartz . quartz jobbean;
公共类Job1扩展QuartzJobBean {
private int超时;
private static int I=0;
//调度工厂实例化后,超时时间后开始调度。
public void setTimeout(int time out){
this . time out=time out;
}
/**
*有待安排的具体任务
*/
@覆盖
受保护的void execute internal(JobExecutionContext上下文)
引发JobExecutionException {
System.out.println(定时任务进行中…);
}
}第二步:spring配置文件中配置作业类JobDetailBean
bean name= job 1 class= org . spring framework . scheduling . quartz . jobdetailbean
属性名称=jobClass 值=com.gy.Job1 /
属性名=jobDataAsMap
地图
entry key=timeout value=0 /
/地图
/属性
/bean描述:org . spring framework . scheduling . quartz . job detail bean有两个属性,jobClass属性是java代码中定义的任务类,jobDataAsMap属性是需要注入到这个任务类中的属性值。
第三步:配置作业调度的触发方式(触发器)
Quartz有两种作业触发器,即
org . spring framework . scheduling . quartz . simpletriggerbean
org . spring framework . scheduling . quartz . crontriggerbean
第一种SimpleTriggerBean只支持以一定的频率调用任务,比如每30分钟一次。
配置模式如下:
bean id= simple trigger class= org . spring framework . scheduling . quartz . simpletriggerbean
属性名称=jobDetail ref=job1 /
属性名称=startDelay 值=0 /!-调度工厂实例化后,调度在0秒后开始-
property name= repeat interval value= 2000 /!-每2秒调度一次-
/bean第二个CronTriggerBean支持在指定时间运行一次,比如每天12:00运行一次。
bean id= cron trigger class= org . spring framework . scheduling . quartz . crontriggerbean
属性名称=jobDetail ref=job1 /
!—每天12:00运行一次-
属性名称=cronExpression 值=0 0 12 * *?/
/bean有关cronExpression表达式的语法,请参见附录。
第四步:配置调度工厂
bean class= org . spring framework . scheduling . quartz . schedulerfactorybean
属性名=触发器
目录
ref bean=cronTrigger /
/列表
/属性
/bean description:此参数指定以前配置的触发器的名称。
第五步:启动你的应用即可,即将工程部署至tomcat或其他容器。
第二种,作业类不继承特定基类。(推荐)
Spring能够支持这种方式,得益于两个类:
org . spring framework . scheduling . timer . methodinvokingtimertaskforybean
org . spring framework . scheduling . quartz . methodinvokingjobdetailfactorybean
这两个类对应的是spring支持的两种任务调度方式,即timer task和Quartz,是前面提到的java原生的。这里只写MethodinVokingJobDetailFactoryBean的用法。使用这个类的好处是我们的任务类不再需要继承任何类,而是一个普通的pojo。
第一步:编写任务类
公共类作业2 {
公共void doJob2() {
System.out.println(不要继承QuartzJobBean模式-调度正在进行中.);
}
}如你所见,这是一个普通的类,有一个方法。
第二步:配置作业类
bean id=job2
class= org . spring framework . scheduling . quartz . methodinvokingjobdetailfactorybean
属性名=targetObject
bean class=com.gy.Job2 /
/属性
属性名称=targetMethod 值=doJob2 /
属性名=concurrent 值=false /!-不同时安排作业-
/bean描述:这一步是关键的一步。声明一个具有两个关键属性的MethodinVokingJobDetailFactoryBean:target object指定任务类,targetMethod指定运行方法。下一步与方法1相同,为了完整起见发布。
第三步:配置作业调度的触发方式(触发器)
Quartz有两种作业触发器,即
org . spring framework . scheduling . quartz . simpletriggerbean
org . spring framework . scheduling . quartz . crontriggerbean
第一种SimpleTriggerBean只支持以一定的频率调用任务,比如每30分钟一次。
配置模式如下:
bean id= simple trigger class= org . spring framework . scheduling . quartz . simpletriggerbean
属性名称=jobDetail ref=job2 /
属性名称=startDelay 值=0 /!-调度工厂实例化后,调度在0秒后开始-
property name= repeat interval value= 2000 /!-每2秒调度一次-
/bean第二个CronTriggerBean支持在指定时间运行一次,比如每天12:00运行一次等等。
bean id= cron trigger class= org . spring framework . scheduling . quartz . crontriggerbean
属性名称=jobDetail ref=job2 /
!—每天12:00运行一次-
属性名称=cronExpression 值=0 0 12 * *?/
/bean你可以根据实际情况选择以上两种方式中的一种。
第四步:配置调度工厂
bean class= org . spring framework . scheduling . quartz . schedulerfactorybean
属性名=触发器
目录
ref bean=cronTrigger /
/列表
/属性
/bean description:此参数指定以前配置的触发器的名称。
第五步:启动你的应用即可,即将工程部署至tomcat或其他容器。
至此,春石英的基本配置已经介绍完毕。当然,在使用之前,弹簧和石英的相应包装都要进口,这就不用说了。
其实可以看出石英的配置看起来还是挺复杂的,没办法,因为石英其实是一个重量级的工具。如果我们只想简单地执行一些简单的定时任务,有没有更简单的工具?是啊!
当前位置上一节介绍了石英在弹簧中的应用。本文介绍的是Spring3.0之后自主研发的定时任务工具spring task,可以比作一个轻量级的Quartz。使用简单,除了Spring相关的包之外不需要额外的包,支持注释和配置文件。
形式,下面将分别介绍这两种方式。
Spring-Task
第一步:编写作业类
即普通pojo,如下:
导入org . spring framework . stereotype . service;
@服务
公共类任务{
5公共无效工单1() {
System.out.println("任务正在进行。");
}
} 第二步:在spring配置文件头中添加命名空间及描述
beans xmlns= http://www . spring framework . org/schema/beans
xmlns:task= http://www . spring framework . org/schema/task
xsi:架构位置= http://www。spring框架。org/schema/task http://。spring框架。org/schema/task/spring-task-3.0。xsd 第三步:spring配置文件中设置具体的任务
任务:计划任务
task:scheduled ref= task job method= job 1 cron= 0 * * * *?/
/任务:计划的任务
上下文:组件扫描base-package= com。gy。我的任务/说明:参考参数指定的即任务类,方法指定的即需要运行的方法,cron及每秒多次表达式,具体写法这里不介绍了,详情见上篇文章附录。
上下文:组件扫描base-package= com。gy。我的任务/这个配置不消多说了,春天扫描注解用的。
到这里配置就完成了,是不是很简单。
第一种:配置文件方式
也许我们不想每写一个任务类还要在可扩展标记语言文件中配置下,我们可以使用注解@已安排,我们看看源文件中该注解的定义:
@ Target({ Java。郎。注释。元素类型。方法,Java。郎。注释。元素类型。批注_类型})
@保留(保留政策.运行时间)
@已记录
计划的公共@接口
{
公共抽象字符串cron();
公共抽象长固定延时();
公共抽象长固定费率();
} 可以看出该注解有三个方法或者叫参数,分别表示的意思是:
克朗:指定时间单位表达式
固定延迟:官方文档解释:基于时间间隔的触发器,时间间隔从上一个任务的完成时间开始计算。时间单位值以毫秒为单位。即表示从上一个任务完成开始到下一个任务开始的间隔,单位是毫秒。
固定汇率:官方文档解释:基于间隔的触发器,其中间隔从上一个任务的开始时间开始测量。时间单位值以毫秒为单位。即从上一个任务开始到下一个任务开始的间隔,单位是毫秒。
下面我来配置一下。
第一步:编写pojo
导入org。spring框架。日程安排。注释。预定;
导入org。spring框架。刻板印象。组件;
@Component("taskJob ")
公共类任务{
@Scheduled(cron=0 0 3 * *?)
公共无效工单1() {
System.out.println("任务进行中。");
}
} 第二步:添加task相关的配置:
?可扩展标记语言版本=1.0 编码=UTF八号?
豆子xmlns= http://www。spring框架。组织/架构/bean
xmlns:xsi= http://。w3。org/2001/XML架构实例 xmlns:AOP= http://www。spring框架。组织/架构/AOP
xmlns:context= http://www。spring框架。组织/架构/上下文
xmlns:tx= http://www。spring框架。组织/架构/事务
xmlns:task= http://。spring框架。组织/方案/任务
xsi:schemaLocation=
http://www.springframework.org/schema/beans http://www。spring框架。org/schema/beans/spring-beans-3.0。文件
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www。spring框架。org/schema/JDBC/斯普林-JDBC-3.0。文件
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/task http://www。spring框架。org/schema/task/spring-task-3.0。xsd
default-lazy-init=false
上下文:批注-配置/
!—春天扫描注解的配置-
上下文:组件扫描base-package= com。gy。我的任务/
!—开启这个配置,春天才能识别@已安排注解-
任务:批注驱动的调度程序=qbScheduler 模式=proxy/
任务:计划程序id= QB调度程序 pool-size= 10 /说明:理论上只需要加上任务:注释驱动/这句配置就可以了,这些参数都不是必须的。
好的配置完毕,当然春季任务还有很多参数,我就不一一解释了,具体参考文件文档http://www。spring框架。org/schema/task/spring-task-3.0。xsd。
更多编程相关知识,请访问:编程视频!以上就是爪哇岛定时任务实现的几种方式是什么的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。