现在遇到一个问题,原有的短信发送平台,每天早上8点,会给当天生日的员工发送生日祝福。现在客户提新的需求,要求每个月1号给当月入党的党员发送廉政警言。我在原有的基础上做尽可能小的修改,所以就还是用java的Timer来实现。
Timer的scheduleAtFixedRate方法,最后一个参数是long型的,对于每个月的第一天,这个long是不固定的,好像直接实现不了。
请大家指教!
据我所知,java典型的有三种定时器。一一简介如下:
java定时器。java提供了了类java.util.TimerTask类基于线程的方式来实现定时任务的操作,然后再提供java.util.Timer类来注册调用,先创建一个类 RingTask 继承 java.util.TimerTask,实现run方法。
缺点:时间的设定不够灵活,服务器开启不会触发定时器。
Spring定时器。spring定时器是在spring框架中应用较成熟的一种方式,spring将定时任务的调用部分提到了配置文件当中,使定时器的触发条件变得更加灵活,spring定时器的实现,仍然需要 继承 java.util.TimerTask,实现run方法。需要配置。
缺点:对于指定了具体的年月日时分秒而执行的任务还是不能解决。
Quartz定时器。Quartz是基于Spring框架之上的更加强大的定时器,它不仅可以轻松的实现前面两种定时器的功能,还实现了非常繁复的时间触发执行的任务,Quartz有两种方式来调度定时任务,一是使用Spring提供的 MethodInvokingJobDetailFactoryBean 代理类,Quartz通过该代理类直接调度任务类的某个函数;二是任务类继承QuartzJobBean类或者实现org.quartz.Job接口,Quartz通过该父类或者接口进行调度。需要配置。
按照你的需求,可以使用Quartz定时器,触发时间设置如下:
0 0 0 1 * ? 每月1号上午00点00分触发
其他由你自己去探索实现。