JAVA中定时自动完成任务的实现

JAVA中定时自动完成任务的实现,第1张

JAVA中定时自动完成任务的实现要用到JAVA中的定时器TimerTask和监听器 听起来貌似有点困难但是实现起来还是比较容易的!纸老虎~~!

下面的列子很详细 是关于定时向服务器上传(也可以是其他的动作这是看需要关于上传我博客有写过可以参考)文件的列子简单的 步就可以实现

首先创建动作bean

package sun time

public class UploadFile{

/**

*实现上传的代码s省略  可以看下我下面的 篇日志

__haiming/blog/static/ / 使用 *** arupload 实现上传下载[有例子]

__haiming/blog/static/ / 使用Struts 多文件上传

*/

public void upload()

{

System out println( 系统自动的上传文件了 )

}

}

创建定时器MyTaker并完成相应的功能

package sun time

import java util Calendar

import java util TimerTask

import javax servlet ServletContext

public class MyTaker extends TimerTask {

private static boolean isRun = false

private   ServletContext context

private Calendar ca  = Calendar getInstance()

public MyTaker(ServletContext context)

{

ntext = context

}

@Override

public void run() {

if(!isRun){

if( ==ca get(Calendar MINUTE)){

isRun = true

context log( 正在执行所加载的任务 )

UploadFile uf= new UploadFile()

uf upload()

isRun =false

context log( 任务顺利完成 )

}

}

else

{

System out println( 任务还没有执行完毕 )

}

}

}

创建监听器ContextListener

package sun time

import javax servlet ServletContextEvent

import javax servlet ServletContextListener

import sun time MyTaker

import java util *

public class ContexListener  implements ServletContextListener{

private  Timer timer = null

@Override

public void contextDestroyed(ServletContextEvent event) {

timer cancel()

event getServletContext() log( 任务列表已经销毁了 )

}

@Override

public void contextInitialized(ServletContextEvent event) {

timer = new Timer(true)

event getServletContext() log( 服务器已经启动了 )

timer schedule(new  MyTaker(event getServletContext()) )///每隔多长时间检查扫描一次

event getServletContext() log( 已经加载了任务的列表 )

}

}

最后一步就是在web xml中配置监听

<! Java定时器 >

<listener>

<listener class>sun time ContexListener</listener class>

lishixinzhi/Article/program/Java/hx/201311/26450

java定时任务有三种:

- JDK自带 :JDK自带的Timer以及JDK1.5+ 新增的ScheduledExecutorService;

- Quartz    :简单却强大的JAVA作业调度框架

- Spring3.0以后自带的task :可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多;

代码参考:

JDK 自带的定时器实现

schedule(TimerTask task, Date time) 特定时间执行

public static void main(String[] args) {

for (int i = 0i <10++i) {

new Timer("timer - " + i).schedule(new TimerTask() {

@Override

public void run() {

println(Thread.currentThread().getName() + " run ")

}

}, new Date(System.currentTimeMillis() + 2000))

}

}

Quartz 定时器实现

2.1  通过maven引入依赖(这里主要介绍2.3.0)  注意:shiro-scheduler中依赖的是1.x版本  如果同时使用会冲突

<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->

<dependency>

<groupId>org.quartz-scheduler</groupId>

<artifactId>quartz</artifactId>

<version>2.3.0</version>

</dependency>

2.2 创建Job类

public class TestJob implements Job{

@Override

public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

println(Thread.currentThread().getName() + " test job begin " + DateUtil.getCurrentTimeStr())

}

}

2.3 调度任务

public static void main(String[] args) throws InterruptedException, SchedulerException {

Scheduler scheduler = new StdSchedulerFactory().getScheduler()

// 开始

scheduler.start()

// job 唯一标识 test.test-1

JobKey jobKey = new JobKey("test" , "test-1")

JobDetail jobDetail = JobBuilder.newJob(TestJob.class).withIdentity(jobKey).build()

Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("test" , "test")

// 延迟一秒执行

.startAt(new Date(System.currentTimeMillis() + 1000))

// 每隔一秒执行 并一直重复

.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())

.build()

scheduler.scheduleJob(jobDetail , trigger)

Thread.sleep(5000)

// 删除job

scheduler.deleteJob(jobKey)

}

3.Spring 相关的任务调度

3.1 配置文件实现

spring-schedule.xml

<task:scheduler id="myScheduler" pool-size="10" />

<task:scheduled-tasks scheduler="myScheduler">

<task:scheduled ref="job" method="test" cron="0 * * * * ?"/>

</task:scheduled-tasks>

3.2注解实现

spring-schedule.xml

<task:scheduler id="myScheduler" pool-size="10" />

// 启用注解

<task:annotation-driven scheduler="myScheduler"/>

@Component 

public class Task{    

@Scheduled(cron="0/5 * *  * * ? ")   //每5秒执行一次

public void execute(){  

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") 

System.out.println(sdf.format(DateTime.now().toDate())+"*********B任务每5秒执行一次进入测试")   

}     

}

JDK 自带的定时器实现

// schedule(TimerTask task, long delay) 延迟 delay 毫秒 执行

// schedule(TimerTask task, Date time) 特定时间执行

public static void main(String[] args) {

for (int i = 0i <10++i) {

new Timer("timer - " + i).schedule(new TimerTask() {

@Override

public void run() {

println(Thread.currentThread().getName() + " run ")

}

}, 1000)

}

}

2. Quartz 定时器实现

//首先我们需要定义一个任务类,比如为MyJob02 ,

//该类需要继承Job类,然后添加execute(JobExecutionContext context)方法,在

//这个方法中就是我们具体的任务执行的地方。

//由希望由调度程序执行的组件实现的接口

public class MyJob02 implements Job {

@Override

public void execute(JobExecutionContext context) throws JobExecutionException {

// TODO Auto-generated method stub

// 执行响应的任务.

System.out.println("HelloJob.execute,"+new Date())

}

}

public class QuartzTest5 {

public static void main(String[] args) throws Exception {

//SchedulerFactory 是一个接口,用于Scheduler的创建和管理

SchedulerFactory factory = new StdSchedulerFactory()

//从工厂里面拿到一个scheduler实例

//计划表(可能翻译的不太贴切),现在我们有了要做的内容,

//与调度程序交互的主要API

/*

* Scheduler的生命期,从SchedulerFactory创建它时开始,

到Scheduler调用shutdown()方法时结束;Scheduler被创建后,

可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的 *** 作

(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,

才会真正地触发trigger(即执行job)

*/

Scheduler scheduler = factory.getScheduler()

//具体任务.

//用于定义作业的实例

//JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。

JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build()

//Trigger(即触发器) - 定义执行给定作业的计划的组件

//TriggerBuilder - 用于定义/构建触发器实例

CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")

.withSchedule(CronScheduleBuilder.cronSchedule("0/1  * * * * ?")).build()

scheduler.scheduleJob(job, trigger)

scheduler.start()

}

3. Spring  boot 任务调度(这个非常容易实现)

/*

*  开启对定时任务的支持

*  在相应的方法上添加@Scheduled声明需要执行的定时任务。

*/

@EnableScheduling

//@EnableScheduling注解来开启对计划任务的支持

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class, args)

}

}

@Component

public class ScheduledTasks {

private Logger logger = LoggerFactory.getLogger(ScheduledTasks.class)

private    int     i=0

//0 0 0 2 * ?

@Scheduled(cron="*  *  *  2  *  ?")

//@Scheduled 注解用于标注这个方法是一个定时任务的方法

public void testFixDelay() {

logger.info("执行方法"+i++)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11940407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存