「java定时器框架」定时任务java框架

博主:adminadmin 2023-03-20 11:58:09 575

今天给各位分享java定时器框架的知识,其中也会对定时任务java框架进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Java定时器

好多朋友用过Windows的任务计划 也有不少程序迷自己曾写过时钟报警 系统自动关机等趣味程序 可却很少有朋友在Web工程中实现过类似功能

当Web工程启动时 定时器能自动开始计时 在整个Web工程的生命期里 定时器能在每晚深夜触发一次任务 因此定时器的存放位置也值得考查 不能简单的存在于单个Servlet或JavaBean中 必须能让定时器宿主的存活期为整个Web工程生命期 在工程启动时能自动加载运行 结合这两点 跟 Servlet上下文有关的侦听器就最合适不过了 通过在工程的配置文件中加以合理配置 会在工程启动时自动运行 并在整个工程生命期中处于监听状态

下面就Servlet侦听器结合Java定时器来讲述整个实现过程 要运用Servlet侦听器需要实现 javax servlet ServletContextListener接口 同时实现它的contextInitialized (ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数 考虑定时器有个建立和销毁的过程 看了前面两个接口函数 就不容置疑的把建立的过程置入 contextInitialized 把销毁的过程置入contextDestroyed了

我把ServletContextListener的实现类取名为ContextListener 在其内添加一个定时器 示例代码如下所示

import java util Timer;

import javax servlet ServletContextEvent;

import javax servlet ServletContextListener;

import javax servlet ServletException;

import javax servlet ServletRequest;

import javax servlet ServletResponse;

import javax servlet HttpServlet;

public class ContextListener

extends HttpServlet

implements ServletContextListener {

public ContextListener() {

}

private java util Timer timer = null;

public void contextInitialized(ServletContextEvent event) {

timer = new java util Timer(true);

event getServletContext() log( 定时器已启动 );

timer schedule(new MyTask(event getServletContext()) * * );

event getServletContext() log( 已经添加任务调度表 );

}

public void contextDestroyed(ServletContextEvent event) {

timer cancel();

event getServletContext() log( 定时器销毁 );

}

}

以上代码中 timer schedule(new MyTask(event getServletContext()) * * )这一行为定时器调度语句 其中MyTask是自定义需要被调度的执行任务(在我的财政数据中心项目中就是报表计算引擎入口) 从 java util TimerTask继承 下面会重点讲述 第三个参数表示每小时(即 * * 毫秒)被触发一次 中间参数 表示无延迟 其它代码相当简单 不再详细说明

下面介绍MyTask的实现 上面的代码中看到了在构造MyTask时 传入了javax servlet ServletContext类型参数 是为记录Servlet日志方便而传入 因此需要重载MyTask的构造函数(其父类java util TimerTask原构造函数是没有参数的) 在timer schedule()的调度中 设置了每小时调度一次 因此如果想实现调度任务每 小时被执行一次 还需要判断一下时钟点 以常量C_SCHEDULE_HOUR表示(晚上 点 也即 点) 同时为防止 小时执行下来 任务还未执行完(当然 一般任务是没有这么长的) 避免第二次又被调度以引起执行冲突 设置了当前是否正在执行的状态标志isRunning 示例代码如下所示

import java util *;

import javax servlet ServletContextEvent;

import javax servlet ServletContextListener;

import javax servlet ServletException;

import javax servlet ServletRequest;

import javax servlet ServletResponse;

import javax servlet HttpServlet;

import javax servlet *;

public class MyTask extends TimerTask {

private static final int C_SCHEDULE_HOUR = ;

private static boolean isRunning = false;

private ServletContext context = null;

public MyTask() {

}

public MyTask(ServletContext context) {

ntext = context;

}

public void run() {

Calendar cal = Calendar getInstance();

if (!isRunning) {

if (C_SCHEDULE_HOUR == cal get(Calendar HOUR_OF_DAY)) {

isRunning = true;

context log( 开始执行指定任务 );

//TODO 添加自定义的详细任务 以下只是示例

//系统定时接收邮件

Email email=new Email();

email recieve();

isRunning = false;

context log( 指定任务执行结束 );

}

}

else {

context log( 上一次任务执行还未结束 );

}

}

}

到这儿 ServletContextListener和MyTask的代码都已完整了 最后一步就是把ServletContextListener部署到您的Web工程中去 在您工程的web xml配置文件中加入如下三行

listener

listener class test ContextListener/listener class

/listener

lishixinzhi/Article/program/Java/hx/201311/26421

java定时器

import java.io.IOException;

import java.util.Timer;

public class TimerTest {

public static void main(String[] args) {

Timer timer = new Timer();

timer.schedule(new MyTask(), 1000, 2000);// 在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.

while (true) {// 这个是用来停止此任务的,否则就一直循环执行此任务了

try {

int ch = System.in.read();

if (ch - 'c' == 0) {

timer.cancel();// 使用这个方法退出任务

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

static class MyTask extends java.util.TimerTask {

@Override

public void run() {

// TODO Auto-generated method stub

System.out.println("________");

}

}

}

这段代码基本能满足你需求了 你还有需求就在上面再套一层job 当然如过太复杂了而且这种定时需求很多的话 建议用quartz框架 使用很简单

java的几种定时任务

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 = 0; i 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版本  如果同时使用会冲突

!-- --

dependency

groupIdorg.quartz-scheduler/groupId

artifactIdquartz/artifactId

version2.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秒执行一次进入测试");    

}     

}

Java定时器Java定时器怎么实现一个任务多个时间点,给别人用时间可以改动的

java中quartz框架设置定时任务时,是可以设置各种时间启动的

每天什么时候执行:

value0 59 23 * * ?/value: 如下为每天23:59:00开始执行

value0 1,2,3 11,12 * * ? /value: 每天11:01,11:02,11:03; 12:01,12:02,12:03分执行任务

至于你说的别人可以改时间,你可以把这个时间参数提取处理,放到一个页面或者数据库存起来,然后别人通过页面或者链接数据库修改就行了。

java怎样做定时器每天一点发送一条短信到的需求

如果想用框架的话推荐“Spring Schedule定时任务”。

如果想自己简单的实现的话可以使用java的Timer类和TimerTask类,它们配合可以每隔指定时间执行一次对应的Task,比较简单,参考这篇博客,run函数中放你的发送短信的代码就行了。

java定时任务框架有哪些

类似corn,是框架的,有quartz

jdk自身的,有Timer+TimeTask等等,也可以使用线程来实现

~

关于java定时器框架和定时任务java框架的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。