定时任务:按时间自动上下架(每日统计与刷新状态)

task对象(与数据库关联)

package com.ujiol.system.entity;


import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Date;

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("task")
public class Task {

	private static final long serialVersionUID = 1L;
	@TableId(value = "task_id", type = IdType.AUTO)
	private Long taskId;
	@TableField
	private Integer taskState;
	@TableField
	private String beanName;
	@TableField
	private String methodName;
	@TableField
	private Long processId;
	@TableField
	private Date taskExecuteTime;
	@TableField
	private Integer taskType;
	@ApiModelProperty(value = "创建时间")
	@TableField(fill = FieldFill.INSERT)
	private Date taskCreated;
	@ApiModelProperty(value = "更新时间")
	@TableField(fill = FieldFill.INSERT_UPDATE)
	private Date taskModified;

}

时间处理工具

package com.ujiol.common.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.*;

/**
 * A utility class for parsing and formatting dates as used in this project.
 *
 * @author lee
 * @since 2017/2/17 10:50:00
 */
@Component
public class DateUtils {
    @Autowired
    private RestTemplate restTemplate;

    public static String formatDate(Date date, String datePattern) {
        return new SimpleDateFormat(datePattern).format(date);
    }

    /**
     * Parses the date value using the given date pattern.
     *
     * @param dateValue   The date value to parse.
     * @param datePattern The date pattern to use.
     * @return The parsed date or null.
     */
    public static Date parseDate(String dateValue, String datePattern) {
        try {
            return new SimpleDateFormat(datePattern).parse(dateValue);
        } catch (ParseException e) {
            System.err.println(e.fillInStackTrace());
        }
        return null;
    }

    public static Object countTwoDate(Object startDate, Object endDate) {

        Date start = (Date) startDate;
        Date end = (Date) endDate;
        Calendar cal = Calendar.getInstance();
        cal.setTime(start);
        long time1 = cal.getTimeInMillis();
        cal.setTime(end);
        long time2 = cal.getTimeInMillis();
        long between_days = (time2 - time1) / (1000 * 3600 * 24);
        return Integer.parseInt(String.valueOf(between_days));

    }

    public static Object countTwoDayWeek(Object startDate, Object endDate) {
        {
            Date start = (Date) startDate;
            Date end = (Date) endDate;
            Calendar cal = Calendar.getInstance();
            cal.setTime(start);
            long time1 = cal.getTimeInMillis();
            cal.setTime(end);
            long time2 = cal.getTimeInMillis();
            long between_days = (time2 - time1) / (1000 * 3600 * 24);
            Long between_mins = (time2 - time1) % (1000 * 3600 * 24);
            Double days = Double.parseDouble(String.valueOf(between_days));
            if ((days / 7) > 0 && (days / 7) < 1) {
                // 不满一周的按一周算
                return 1;
            } else if (days / 7 >= 1) {
                int day = days.intValue();
                if (day % 7 >= 0 && between_mins > 0) {
                    return day / 7 + 1;
                } else {
                    return day / 7;
                }
            } else if ((days / 7) == 0) {
                return 0;
            } else {
                // 负数返还null
                return null;
            }
        }
    }

    public static int lastDate(Date date1, Date date2) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date2);
        int l2 = cal.get(Calendar.DAY_OF_YEAR);
        cal.setTime(date1);
        int l1 = cal.get(Calendar.DAY_OF_YEAR);
        return l2 - l1;
    }

    public static int lastWeek(Date date1, Date date2) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date2);
        int l1 = cal.get(Calendar.WEEK_OF_YEAR);
        cal.setTime(date1);
        int l2 = cal.get(Calendar.WEEK_OF_YEAR);
        return l1 - l2;
    }

    /**
     * 根据日期获取当天是周几
     *
     * @param
     * @return 周几
     */
    public static Integer dateToWeek(Date date) {
        Integer[] weekDays = {7, 1, 2, 3, 4, 5, 6};
        // String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        return weekDays[w];
    }

    /**
     * 根据日期获取当天是周几
     *
     * @param
     * @return 周几
     */
    public static String dateToWeekCN(Date date) {
        String[] weekDays = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};
        // String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        return weekDays[w];
    }

    public static Date getYearFirst(int year) {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        Date currYearFirst = calendar.getTime();
        return currYearFirst;
    }
    public static Date getDateYel(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(calendar.DATE, -1);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date zero = calendar.getTime();
        return zero;
    }

    public static Date getDateZero(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date zero = calendar.getTime();
        return zero;
    }

    public static Date getTomorrowDate(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(calendar.DATE, 1);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date tomorrow = calendar.getTime();
        return tomorrow;
    }

    public static int getHour(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.HOUR_OF_DAY);
    }

    public static String getPastDate(int past, Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - past);
        Date today = calendar.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String result = sdf.format(today);
        return result;
    }

    public static Date getPastDate2(int past, Date date) {
        Date dayZero = getDateZero(date);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dayZero);
        calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - past);
        Date day = calendar.getTime();
        return day;
    }

    public static String getYearSemester(Date date) {
        String yearSemester;
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int currentMonth = calendar.get(Calendar.MONTH) + 1;
        if (currentMonth >= 1 && currentMonth <= 2) {
            yearSemester = "1";
        } else if (currentMonth >= 3 && currentMonth <= 7) {
            yearSemester = "2";
        } else {
            yearSemester = "1";
        }
        return yearSemester;
    }

    public static int getLastMinutes(Date date1, Date date2) {
        return (int) ((date2.getTime() - date1.getTime()) / 60 / 100);
    }

    public static List<Date> getDatesBetweenTwoDate(Date beginDate, Date endDate) {
        List<Date> lDate = new ArrayList<Date>();
        lDate.add(beginDate);
        Calendar cal = Calendar.getInstance();
        cal.setTime(beginDate);
        boolean bContinue = true;
        while (bContinue) {
            cal.add(Calendar.DAY_OF_MONTH, 1);
            if (endDate.after(cal.getTime())) {
                lDate.add(cal.getTime());
            } else {
                break;
            }
        }
        lDate.add(endDate);
        return lDate;
    }

    public static int yearsBetween(String start, String end) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar startDate = Calendar.getInstance();
        Calendar endDate = Calendar.getInstance();
        startDate.setTime(sdf.parse(start));
        endDate.setTime(sdf.parse(end));
        return (endDate.get(Calendar.YEAR) - startDate.get(Calendar.YEAR));
    }

    public static int yearsBetween(Date start, Date end) throws ParseException {
        int day1 = start.getDay();
        int day2 = end.getDay();
        return (day2 - day1) / 365;
    }

    public static LocalTime dateToLocalTime(Date date) {
        Instant instant = date.toInstant();
        ZoneId zone = ZoneId.systemDefault();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
        LocalTime localTime = localDateTime.toLocalTime();
        return localTime;
    }

    public static Date getMondayByDate(Date time) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 设置时间格式
        Calendar cal = Calendar.getInstance();
        cal.setTime(time);
        // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        cal.setFirstDayOfWeek(Calendar.MONDAY);// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
        int day = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
        return cal.getTime();
    }

    public static Date getDayStart(Date date) {
        Calendar c = new GregorianCalendar();
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        return c.getTime();
    }

    public static Date getDayEnd(Date date) {
        Calendar c = new GregorianCalendar();
        c.set(Calendar.HOUR_OF_DAY, 23);
        c.set(Calendar.MINUTE, 59);
        c.set(Calendar.SECOND, 59);
        return c.getTime();
    }

    public static Long dateDiff(Date startDate, Date endDate) throws ParseException {
        long nd = 1000 * 24 * 60 * 60;
        long nh = 1000 * 60 * 60;
        long nm = 1000 * 60;
        long diff = endDate.getTime() - startDate.getTime();
        long day = diff / nd;
        long hour = diff % nd / nh;
        long min = diff % nd % nh / nm;
        return min;
    }

    public static String getCron(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int month = calendar.get(Calendar.MONTH)+1;
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
        String cron = String.valueOf(second) + " " + String.valueOf(minute) + " " + String.valueOf(hour) + " "
                + String.valueOf(day) + " " + String.valueOf(month) + " " + "?";
        return cron;
    }

}

定时任务加载内容类

package com.ujiol.common.taskjob;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.config.CronTask;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @program: simple-demo
 * @description: 添加定时任务注册类,用来增加、删除定时任务。
 * @author: 
 * @date: 2019/5/23
 **/
@Component
public class CronTaskRegistrar implements DisposableBean {

    private final Map<CronTask, ScheduledTask> scheduledTasks = new ConcurrentHashMap<>();

    @Autowired
    private TaskScheduler taskScheduler;

    public TaskScheduler getScheduler() {
        return this.taskScheduler;
    }

    /**
     * 新增定时任务
     * @param task
     * @param cronExpression
     */
    public void addCronTask(Runnable task, String cronExpression) {
        addCronTask(new CronTask(task, cronExpression));
    }

    public void addCronTask(CronTask cronTask) {
        if (cronTask != null) {
            //Runnable task = cronTask.getRunnable();
            if (this.scheduledTasks.containsKey(cronTask)) {
                removeCronTask(cronTask);
            }

            this.scheduledTasks.put(cronTask, scheduleCronTask(cronTask));
        }
    }

    /**
     * 移除定时任务
     * @param
     */
    public void removeCronTask(CronTask cronTask) {
    	Runnable task = cronTask.getRunnable();
        ScheduledTask scheduledTask = this.scheduledTasks.remove(task);
        if (scheduledTask != null)
            scheduledTask.cancel();
    }

    public ScheduledTask scheduleCronTask(CronTask cronTask) {
        ScheduledTask scheduledTask = new ScheduledTask();
        scheduledTask.future = this.taskScheduler.schedule(cronTask.getRunnable(), cronTask.getTrigger());

        return scheduledTask;
    }


    @Override
    public void destroy() {
        for (ScheduledTask task : this.scheduledTasks.values()) {
            task.cancel();
        }
        this.scheduledTasks.clear();
    }
}

取消定时任务类

package com.ujiol.common.taskjob;

import java.util.concurrent.ScheduledFuture;

/**
 * @program: simple-demo
 * @description: 定时任务控制类
 * @author: CaoTing
 * @date: 2019/5/23
 **/
public final class ScheduledTask {

    public volatile ScheduledFuture<?> future;
    /**
     * 取消定时任务
     */
    public void cancel() {
        ScheduledFuture<?> future = this.future;
        if (future != null) {
            future.cancel(true);
        }
    }
}

定时任务执行类

package com.ujiol.common.taskjob;

import cn.hutool.extra.spring.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Method;
import java.util.Objects;

/**
 * @program: simple-demo
 * @description: 定时任务运行类
 * @author: CaoTing
 * @date: 2019/5/23
 **/
@Slf4j
public class SchedulingRunnable implements Runnable {


    private String beanName;

    private String methodName;

    private Object[] params;

    public SchedulingRunnable(String beanName, String methodName) {
        this(beanName, methodName, null);
    }

    public SchedulingRunnable(String beanName, String methodName, Object...params ) {
        this.beanName = beanName;
        this.methodName = methodName;
        this.params = params;
    }

    @Override
    public void run() {
        log.info("定时任务开始执行 - bean:{},方法:{},参数:{}", beanName, methodName, params);
        long startTime = System.currentTimeMillis();

        try {
            Object target = SpringUtil.getBean(beanName);

            Method method = null;
            if (null != params && params.length > 0) {
                Class<?>[] paramCls = new Class[params.length];
                for (int i = 0; i < params.length; i++) {
                    paramCls[i] = params[i].getClass();
                }
                method = target.getClass().getDeclaredMethod(methodName, paramCls);
            } else {
                method = target.getClass().getDeclaredMethod(methodName);
            }

            ReflectionUtils.makeAccessible(method);
            if (null != params && params.length > 0) {
                method.invoke(target, params);
            } else {
                method.invoke(target);
            }
        } catch (Exception ex) {
            log.error(String.format("定时任务执行异常 - bean:%s,方法:%s,参数:%s ", beanName, methodName, params), ex);
        }

        long times = System.currentTimeMillis() - startTime;
        log.info("定时任务执行结束 - bean:{},方法:{},参数:{},耗时:{} 毫秒", beanName, methodName, params, times);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        SchedulingRunnable that = (SchedulingRunnable) o;
        if (params == null) {
            return beanName.equals(that.beanName) &&
                    methodName.equals(that.methodName) &&
                    that.params == null;
        }

        return beanName.equals(that.beanName) &&
                methodName.equals(that.methodName) &&
                params.equals(that.params);
    }

    @Override
    public int hashCode() {
        if (params == null) {
            return Objects.hash(beanName, methodName);
        }

        return Objects.hash(beanName, methodName, params);
    }
}

执行调用方法

	private void handleTask(Activity activity) {
		Task task = new Task();
		task.setBeanName(beanName);
		task.setMethodName(methodName);
		task.setProcessId(activity.getActivityId());
		task.setTaskExecuteTime(activity.getActivityStartTime());
		task.setTaskType(taskType);
		taskService.save(task);
		SchedulingRunnable tasks = new SchedulingRunnable(task.getBeanName(), task.getMethodName(), task.getProcessId(),
				task.getTaskType());
		CronTaskRegistrar cronTaskRegistrar = new CronTaskRegistrar();
		cronTaskRegistrar.addCronTask(tasks, DateUtils.getCron(task.getTaskExecuteTime()));
	}

重启程序添加数据库中的定时任务 

package com.ujiol.common.taskjob;


import com.ujiol.system.service.TaskService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(value = 1)
public class LoadTask implements ApplicationRunner {

    private static final Logger LOGGER = LoggerFactory.getLogger(LoadTask.class);

    @Autowired
    private CronTaskRegistrar cronTaskRegistrar;

    @Autowired
    private TaskService taskService;

    /**
     * 程序启动完毕后,需要自启的任务
     */
    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        LOGGER.info(" >>>>>> 项目启动完毕, 开启 => 需要自启的任务 开始!");
        TaskExample taskExample = new TaskExample();
        taskExample.or().andTaskStateEqualTo(0);
        if (taskService.existsByExample(taskExample)) {
            List<Task> taskList = taskService.findAllByExample(taskExample);
            for (Task task : taskList) {
                task.setTaskState(1);
                taskService.updateByEntity(task);
                SchedulingRunnable tasks = new SchedulingRunnable(task.getBeanName(), task.getMethodName(),
                        task.getEquipmentDomainName(), task.getEquipmentPortNumber(), task.getStartDate(),
                        task.getEndDate(), task.getVideoRecordId());
                cronTaskRegistrar.addCronTask(tasks, getCron(task.getEndDate()));
            }
            LOGGER.info(" >>>>>> 项目启动完毕, 开启 => 需要自启的任务 结束!");
        }
        LOGGER.info(" >>>>>> 项目启动完毕, 开启 => 暂无自启的任务 结束!");
    }

    private String getCron(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
        String cron = String.valueOf(second) + " " + String.valueOf(minute) + " " + String.valueOf(hour) + " "
                + String.valueOf(day) + " " + String.valueOf(month) + " " + "?";
        return cron;
    }

}

---------------------------------------------------------------------------------------------------------------------------------

定时任务之(每日定时任务)

package com.ujiol.common.taskjob;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ujiol.common.model.Result;
import com.ujiol.system.entity.Activity;
import com.ujiol.system.entity.Task;
import com.ujiol.system.service.ActivityService;
import com.ujiol.system.service.TaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.List;

@Transactional
@RestController
public class ActivityTask {

	@Autowired
	private TaskService taskService;

	@Autowired
	private ActivityService activityService;

	private int activityStatus = 0; // 未生效
	private int activityingStatus = 1; // 生效
	private int unActivityStatus = 2; // 过期

	@RequestMapping(value = "/activityTask", method = RequestMethod.POST)
	//设置凌晨来刷新
	@Scheduled(cron = "0 0 1 * * ?")
	public Result<?> activityTask() {
		Date date = new Date();
		// 1. 将正在生效规则置为过期 2.将待生效规则置为生效 3. 任务表中标记为已执行
		QueryWrapper<Activity> queryWrapper = new QueryWrapper();
		queryWrapper.eq("activity_status", activityStatus)
				.le("activity_start_time", new Date());
		List<Activity> activityList = activityService.list(queryWrapper);
		for (Activity activity : activityList) {
			queryWrapper.clear();
			queryWrapper.eq("activity_id", activity.getActivityId())
					.eq("activity_status", activityingStatus);
			Activity ac = activityService.getOne(queryWrapper);
			if (ac != null) {
				ac.setActivityStatus(unActivityStatus);
				ac.setActivityUpdatedTime(date);
				activityService.updateById(ac);
			}
			activity.setActivityStatus(activityingStatus);
			activityService.updateById(ac);
			QueryWrapper<Task> queryWrapperT = new QueryWrapper();
			queryWrapperT.eq("process_id", ac.getActivityId());
			Task task = taskService.getOne(queryWrapperT);
			task.setTaskType(1);
			taskService.updateById(task);
		}
		return new Result<>(Result.RESULT_SUCCESS);
	}


}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Java 中有许多用于创建定时任务的框,其中最常用的是 `java.util.Timer` 和 `java.util.concurrent.ScheduledThreadPoolExecutor`。 `java.util.Timer` 是一个简单的定时任务,可以在指定的时间执行一个或多个任务。它使用单独的线程来执行任务,可以按照指定的周期或延迟执行任务。 `java.util.concurrent.ScheduledThreadPoolExecutor` 是一个更加复杂的定时任务,它可以执行周期性或延迟任务,并提供了对任务执行的更多控制,包括线程池的大小和任务的执行顺序。 还有其他一些用于创建定时任务的框,例如 `Quartz`、`Spring Task` 和 `Guava's ScheduledExecutorService`。 要选择哪个框取决于你的需求和偏好。如果只需要一个简单的定时任务,`java.util.Timer` 可能足够用了,但如果需要更多的控制和功能,则可能需要使用更复杂的框,如 `java.util.concurrent.ScheduledThreadPoolExecutor`。 ### 回答2: Java定时任务是用于在指定时间或间隔循环执行任务的工具。它提供了一种简单而灵活的方法来安排和执行一些需要定时触发的操作。 最常见的Java定时任务Java自带的Timer类和Quartz库。Timer类是Java中内置的定时任务,它允许您创建一个计划任务,并在指定的时间点或间隔周期性地执行它。但是,Timer类的功能有限,不适用于一些更复杂的定时任务需求。 Quartz库是一个功能强大且灵活的Java定时任务。它提供了更多的功能和选项来管理和调度任务。Quartz可以根据时间表、日期、间隔或从外部触发器等方式执行任务,并提供了更多的灵活性、可靠性和可扩展性。Quartz还支持集群环境和分布式部署,可以轻松地在多个节点上管理任务。 使用Java定时任务,可以方便地执行定时任务,例如定时生成报表、清理垃圾数据、发送定时通知等。您可以配置任务的执行时间、周期、参数和触发条件,还可以处理任务执行过程中的异常情况。通过使用适当的定时任务,您可以更好地管理和优化应用程序的性能和资源。 总而言之,Java定时任务提供了一种便捷的方式来执行各种定时任务,可以满足各种需求。您可以根据具体的任务类型和需求选择合适的定时任务,以提高任务执行的精确性、稳定性和可靠性。 ### 回答3: Java定时任务是一种用于在预定时间执行代码的工具。它可以帮助我们创建和管理定时任务,使得我们可以在特定的时间间隔或时间点执行特定的操作。Java常用的定时任务有Quartz和Spring Task。 Quartz是一个功能强大且广泛使用的Java定时任务。它提供了许多用于设置和管理定时任务的功能,例如定义任务的执行时间、执行频率、执行策略等。Quartz还具有分布式和集群的支持,可以在多台服务器上同时执行任务,提高了任务的可靠性和可扩展性。通过使用Quartz,开发人员可以轻松地创建基于时间触发的代码任务,例如定时生成报表、定时发送邮件等。 Spring Task是Spring中的一个模块,用于处理定时任务。它是基于标准的Java Timer类实现的,通过注解的方式来定义和配置定时任务Spring Task提供了简单易用的API,可以让开发人员以声明式的方式创建定时任务。除了基本的定时任务功能外,Spring Task还提供了更多的扩展功能,如定时任务异步执行、定时任务的调度和管理等。通过使用Spring Task,我们可以更方便地集成和管理定时任务,减少了任务的配置和编码工作。 总的来说,Java定时任务可以帮助开发人员更灵活地控制和调度代码任务的执行,提高了代码的可复用性和扩展性。无论是Quartz还是Spring Task,它们都是成熟且广泛使用的框,可以根据项目需求选择合适的框来使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值