Java触发器CronTrigger

摘要:如果需要像日历那样按日程来触发任务,而不是像SimpleTrigger 那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用。

一、web.xml:

<servlet>
		<servlet-name>boot</servlet-name>
		<servletclass>xxx.xx.x.BootServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
</servlet>

二、创建BootServlet.java

  

public class BootServlet extends HttpServlet {
  public void init(ServletConfig config) throws ServletException {
    super.init(config);
    //初始化数据库
    new SrvInitDB().initDB();
    //启动预警触发器
    startExpenseRemain();
  }
    /***/
    public void startExpenseRemain(){
	 try {
	  Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
	  scheduler.start();
	  //每周的周五进行一次
	  JobDetail expenseRemindJob = new JobDetail("ExpenseRemindJob",null,ExpenseRemindJob.class);
	  CronTrigger expenseRemindJobTrigger=new CronTrigger("expenseRemindJobTrigger");
	  expenseRemindJobTrigger.setStartTime(new Date());
	  expenseRemindJobTrigger.setCronExpression("0 0 12 ? * FRI");
	  scheduler.scheduleJob(expenseRemindJob, expenseRemindJobTrigger);
	 } catch (SchedulerException e) {
	   e.printStackTrace();
	 } catch (ParseException e) {
	  e.printStackTrace();
	 }
	}
}

三、创建Job:ExpenseRemindJob.java

public class ExpenseRemindJob implements Job{
  public void execute(JobExecutionContext arg0) throws JobExecutionException {
    sendExpenseSubjectRemind();
  }
  /***/
  public synchronized void sendExpenseSubjectRemind(){

  }

}

注:

其中new CronTrigger("xxx").setCronExpression("0 0 12 ? * FRI");
共计7个子表达式都描述了一个单独的日程细节。这些子表达式用空格分隔,分别表示: 
1. Seconds 秒 
2. Minutes 分钟 
3. Hours 小时 
4. Day-of-Month 月中的天 
5. Month 月 
6. Day-of-Week 周中的天 ("MON-FRI", "MON, WED, FRI"或者甚至"MON-WED,SAT")
7. Year (optional field) 年(可选的域) 
一个cron表达式的例子字符串为"0 0 12 ? * WED",这表示“每周三的中午12:00”。

所有的域中的值都有特定的合法范围,这些值的合法范围相当明显,例如:秒和分域的合法值为0到59,小时的合法范围是0到23,Day-of-Month中值得合法凡范围是0到31,但是需要注意不同的月份中的天数不同。月份的合法值是0到11。

    或者用字符串JAN,FEB MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV 及DEC来表示。Days-of-Week可以用1到7来表示(1=星期日)或者用字符串SUN, MON, TUE, WED, THU, FRI 和SAT来表示.

  通配符(‘*‘)可以被用来表示域中“每个”可能的值。因此在"Month"域中的*表示每个月,而在Day-Of-Week域中的*则表示“周中的每一天”。

  ‘?‘字符可以用在day-of-month及day-of-week域中,它用来表示“没有指定值”。
    这对于需要指定一个或者两个域的值而不需要对其他域进行设置来说相当有用。

  ‘/‘字符用来表示值的增量,例如, 如果分钟域中放入‘0/15‘,它表示“每隔15分钟,从0开始”,
    如果在分钟域中使用‘3/20‘,则表示“小时中每隔20分钟,从第3分钟开始”或者另外相同的形式就是‘3,23,43‘。

  ‘L‘字符可以在day-of-month及day-of-week中使用,这个字符是"last"的简写,但是在两个域中的意义不同。

    例如,在day-of-month域中的"L"表示这个月的最后一天,即,一月的31日,非闰年的二月的28日。
    如果它用在day-of-week中,则表示"7"或者"SAT"。但是如果在day-of-week域中,这个字符跟在别的值后面,则表示"当月的最后的周XXX"。
    例如:"6L" 或者 "FRIL"都表示本月的最后一个周五。当使用‘L‘选项时,最重要的是不要指定列表或者值范围,否则会导致混乱。

  ‘W‘ 字符用来指定距离给定日最接近的周几(在day-of-week域中指定)。
    例如:如果你为day-of-month域指定为"15W",则表示“距离月中15号最近的周几”。

  ‘#‘表示表示月中的第几个周几。例如:day-of-week域中的"6#3" 或者 "FRI#3"表示“月中第三个周五”。

时间: 2024-08-26 02:18:10

Java触发器CronTrigger的相关文章

JAVA触发器的测试

/***************************************Spring配置代码***************************************/ <!-- 触发器生成器类,用被指定的调度器调度生成指定规则的触发器对象 --> <bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <!-

java实现定时任务 Schedule

1.java定时任务可以借助 java.util.Timer 来实现 [java] view plain copy import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class Test { public static void main(String[] args) { //timer1(); timer2(); //timer

Quartz的简单使用,基于1.X(一)【入门及CronTrigger】

 什么是Quartz Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制.Quartz允许开发人员根据时间间隔来调度作业.它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联.简单地创建一个org.quarz.Job接口的Java类,Job接口包含唯一的方法:     public void execute(JobExecutionContext context) throws JobExecutionExceptio

java定时任务之Qutaz

前不久一直在学习Qztaz,干好写了一个案例分享一下给大家,希望大家可以用得到. 那么现在开始吧, 一:什么事Qutaz? Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用. Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表.Jobs可以做成标准的Java组件或 EJBs.官方网站:http://www.opensymphony.com/quartz 二:

Quartz使用-入门使用(java定时任务实现)

注:这里使用的是Quartz1.6.5版本(包:quartz-1.6.5.jar) [java] view plain copy //<a href="http://lib.csdn.net/base/softwaretest" class='replace_word' title="软件测试知识库" target='_blank' style='color:#df3434; font-weight:bold;'>测试</a>main函数 /

Quartz源码阅读

基于Quartz1.8.5的源码解读 首先看一个demo //简单的任务管理类 //QuartzManager.java package quartzPackage; import java.text.ParseException; import org.quartz.CronTrigger; import org.quartz.Job; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.Sch

任务调度开源框架Quartz动态添加、修改和删除定时任务

Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触发器监听.你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听.Quartz 允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联.整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业.并且还能和Spring配置整合使用.Quartz在功能上远远超越

Quartz使用-入门使用

注:这里使用的是Quartz1.6.5版本(包:quartz-1.6.5.jar) //测试main函数 //QuartzTest.java package quartzPackage; import java.text.SimpleDateFormat; import java.util.Date; public class QuartzTest { /** *//** * @param args */ public static void main(String[] args) { // T

spring与quartz整合实现分布式动态创建,删除,改变执行时间定时任务(mysql数据库)

背景:因为在项目中用到了定时任务,当时想到了spring的quartz,写完发现费了很大功夫,光是整合就花了一上午,其中最大的问题就是版本问题,项目中用的是spring3.2.8的版本,查阅发现,3.0以上的版本需要使用quartz2.X以上版本,我就去官网下载了2.1.7的quartz,结果发现jar包与spring冲突,最后使用了quartz1.6.0版本. spring与quartz整合第一步需要导jar包,这个在百度搜下quartz的jar,下载一个 第二步:分布式定时任务,是基于数据库