欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【工具】定时器(servlet)

程序员文章站 2024-01-14 10:22:10
...
@Component
public class SaiDaListener implements ServletContextListener {

    @Autowired
    private SaiDaEmailService saiDaEmailService;

    private static SaiDaListener saiDaListener=new SaiDaListener();

    @PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作
    public void init() {
        saiDaListener.saiDaEmailService = saiDaEmailService;
        // 初使化时将已静态化的testService实例化
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("定时发送Xml信息监听--已关闭!");
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        calendar.set(year, month, day, 11, 40, 0);
        // 当天8点(默认执行时间)
        Date defaultdate = calendar.getTime();
        Date sendDate;
        if (defaultdate.before(new Date())) {
            // 若当前时间超过了defaultdate时间,当天不再执行,则将执行时间sendDate改为明天8点
            calendar.add(Calendar.DATE, 1);
            sendDate = calendar.getTime();
        }else {
            // 若当前时间没有超过defaultdate时间,则将执行时间sendDate改为defaultdate
            sendDate = defaultdate;
        }

        /*----------------每刻任务 ----------------
          启动服务器后,若此时时间没过8点,等待。到了8点自动执行一次,15分钟后再执行一次,周而复始
          启动服务器后,若此时时间超过8点,会立刻执行一次,等到15分钟后再次执行一次,周而复始到了第二天,不会再判断是否是8点,这个开始时间,只会判断一次而已
         */
//        Timer qTimer = new Timer();
//        qTimer.schedule(new TimerTask() {
//
//            @Override
//            public void run() {
//              //saiDaListener.saiDaEmailService.sendEmail2();
//            }
//        }, defaultdate, 20 * 60 * 1000);// 定时每15分钟
//        System.out.println("每刻定时发送Xml信息监听--已启动!");

        /*----------------每日任务 ----------------
         启动服务器后,若此时时间没过8点,等待。到了8点自动执行一次,24小时后(第二天8点)再执行一次,周而复始
         启动服务器后,若此时时间已经超过8点,则等到24小时后(第二天8点)才执行一次,周而复始
         */
//        Timer dTimer = new Timer();
//        dTimer.schedule(new TimerTask() {
//            @Override
//            public void run() {
//
//            }
//        }, sendDate, 24 * 60 * 60 * 1000);// 定时24小时:24 * 60 * 60 * 1000
//        System.out.println("每日定时发送Xml信息监听--已启动!");

        /*----------------每月任务 ----------------
         启动服务器后,若此时时间没过8点,等待。到了8点自动执行判断是否是当前月份的1号,若是则执行一次,
         24小时后(第二天8点)再执行一次判断(每月1号以后后的29天或30天后才会是下月1号,再执行一次),周而复始 启动服务器后,若此时时间已经超过8点,会立刻执行一次,等到下个月1号再次执行一次,周而复始
         */
        Timer mTimer = new Timer();
        mTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                Calendar c = Calendar.getInstance();
                int day = c.get(Calendar.DAY_OF_MONTH);
                System.out.println("月任务进入");
                //判断是否一号
                if (day == 28) {
                    // 每天执行,若为每月1号才执行
                    System.out.println("月任务执行已执行");
                    saiDaListener.saiDaEmailService.sendEmail();
                }

            }
        }, sendDate, 24 * 60 * 60 * 1000);// 每天执行一次检查

        System.out.println("每月定时发送Xml信息监听--已启动!");
    }
}
相关标签: # 工具类集合