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++)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)