com.ppcxy.cyfm.showcase.demos.schedule.JdkTimerJob.java Source code

Java tutorial

Introduction

Here is the source code for com.ppcxy.cyfm.showcase.demos.schedule.JdkTimerJob.java

Source

/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.ppcxy.cyfm.showcase.demos.schedule;

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.apache.commons.lang3.Validate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.support.TaskUtils;
import org.springside.modules.utils.Threads;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * JDKScheduledThreadPoolExecutor
 * SpringTask NameSpace?, ????.
 *
 * @author calvin
 */
public class JdkTimerJob implements Runnable {

    private int initialDelay = 0;

    private int period = 0;

    private int shutdownTimeout = Integer.MAX_VALUE;

    private ScheduledExecutorService scheduledExecutorService;

    @Autowired
    private UserCountScanner userCountScanner;

    @PostConstruct
    public void start() throws Exception {
        Validate.isTrue(period > 0);

        // ?schedule, Spring TaskUtilsLOG_AND_SUPPRESS_ERROR_HANDLER?
        Runnable task = TaskUtils.decorateTaskWithErrorHandler(this, null, true);

        // ?SechdulerExecutor,guavaThreadFactoryBuilder???
        scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(
                new ThreadFactoryBuilder().setNameFormat("JdkTimerJob-%1$d").build());

        // scheduleAtFixedRatefixRate() ?.
        // scheduleAtFixedDelay() ???.
        scheduledExecutorService.scheduleAtFixedRate(task, initialDelay, period, TimeUnit.SECONDS);
    }

    @PreDestroy
    public void stop() {
        Threads.gracefulShutdown(scheduledExecutorService, shutdownTimeout, TimeUnit.SECONDS);
    }

    /**
     * ??.
     */
    @Override
    public void run() {
        userCountScanner.executeByJdk();
    }

    /**
     * ??.
     */
    public void setInitialDelay(int initialDelay) {
        this.initialDelay = initialDelay;
    }

    /**
     * ,??.
     */
    public void setPeriod(int period) {
        this.period = period;
    }

    /**
     * normalShutdown, ??.
     */
    public void setShutdownTimeout(int shutdownTimeout) {
        this.shutdownTimeout = shutdownTimeout;
    }
}