All Downloads are FREE. Search and download functionalities are using the official Maven repository.

uw.task.TaskCroner Maven / Gradle / Ivy

Go to download

uw-task包是一个分布式任务框架,通过uw-task可以快速构建基于docker的分布式任务体系,同时支持基于influx的任务运维监控。

The newest version!
package uw.task;

import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;

import uw.task.api.TaskAPI;
import uw.task.entity.TaskContact;
import uw.task.entity.TaskCronerConfig;
import uw.task.entity.TaskCronerLog;
import uw.task.util.GlobalSequenceManager;
import uw.task.util.LeaderVote;
import uw.task.util.Utils;

/**
 * 定时任务类。 使用Cron表达式来运行定时任务。
 * 
 * @author axeon
 *
 */
@EnableScheduling
public abstract class TaskCroner implements SchedulingConfigurer {

	private static final Logger log = LoggerFactory.getLogger(TaskCroner.class);

	/**
	 * 直接运行模式。
	 */
	public static final int RUN_TYPE_ANYWAY = 0;

	/**
	 * 运行在全局单例模式下。
	 */
	public static final int RUN_TYPE_SINGLETON = 1;

	/**
	 * 选举
	 */
	@Autowired
	private LeaderVote leaderVote;

	/**
	 * 服务端API
	 */
	@Autowired
	private TaskAPI taskAPI;

	/**
	 * 全局序列发生器。
	 */
	@Autowired
	private GlobalSequenceManager sequence;

	/**
	 * CronTrigger调度器,默认是每秒触发。
	 */
	private CronTrigger trigger = new CronTrigger("*/1 * * * * ?");

	/**
	 * 配置信息
	 */
	private TaskCronerConfig config = null;
	
	/**
	 * 任务日志
	 */
	private TaskCronerLog taskCronerLog = null;

	/**
	 * 是否启动
	 */
	private boolean isStart = false;

	/**
	 * 启动,一般不要调用。
	 */
	public void start() {
		isStart = true;
	}

	/**
	 * 停止,一般不要调用。
	 */
	public void stop() {
		isStart = false;
	}

	/**
	 * 返回当前启动状态。
	 * @return the isStart
	 */
	public boolean isStart() {
		return isStart;
	}

	/**
	 * @return the config
	 */
	public TaskCronerConfig getConfig() {
		return config;
	}

	/**
	 * @param config the config to set
	 */
	public void setConfig(TaskCronerConfig config) {
		this.config = config;
		if (!trigger.getExpression().equalsIgnoreCase(config.getCron())) {
			trigger = new CronTrigger(config.getCron());
		}
		
	}

	/**
	 * 设置新的Cron表达式
	 * 
	 * @param expression
	 */
	public void setCronExpression(String expression) {

	}

	/**
	 * 配置任务
	 * 
	 * @param taskRegistrar
	 */
	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

		taskRegistrar.addTriggerTask(new Runnable() {
			@Override
			public void run() {
				// 判断是否启动
				if (!isStart) {
					return;
				}
				// 判断是否是可运行的主机
				if (config.getRunTarget() != null && config.getRunTarget().length() > 0 && taskAPI.getHostConfig() != null
						&& !taskAPI.getHostConfig().contains(config.getRunTarget())) {
					return;
				}
				// 判断全局唯一条件
				if (config.getRunType() == RUN_TYPE_SINGLETON && !leaderVote.isLeader(this.getClass().getName())) {
					return;
				}
				// 任务逻辑
				taskCronerLog = new TaskCronerLog();
				taskCronerLog.setId(sequence.nextId("task_croner_log"));
				taskCronerLog.setTaskClass(TaskCroner.this.getClass().getName());
				taskCronerLog.setTaskCron(trigger.getExpression());
				taskCronerLog.setRunType(config.getRunType());
				taskCronerLog.setRunTarget(config.getRunTarget());
				taskCronerLog.setHostIp(taskAPI.getHostIp());
				taskCronerLog.setHostId(LeaderVote.UUID);
				String data = "";
				try {
					data = runTask();
					taskCronerLog.setStatus(TaskData.STATUS_SUCCESS);
				} catch (TaskException e) {
					// 出现TaskException,说明是合作方的错误。
					taskCronerLog.setStatus(TaskData.STATUS_FAIL_PARTNER);
					data = Utils.exceptionToString(e);
					log.error(e.getMessage(), e);
				} catch (Exception e) {
					data = Utils.exceptionToString(e);
					taskCronerLog.setStatus(TaskData.STATUS_FAIL_PROGRAM);
					log.error(e.getMessage(), e);
				}
				taskCronerLog.setResultData(data);
			}
		}, new Trigger() {
			@Override
			public Date nextExecutionTime(TriggerContext triggerContext) {
				// 任务触发,可修改任务的执行周期
				Date nextExec = trigger.nextExecutionTime(triggerContext);
				// 在此处写入本次执行的信息
				if (isStart && taskCronerLog != null && taskCronerLog.getId() > 0) {
					if (triggerContext.lastScheduledExecutionTime() != null
							&& triggerContext.lastActualExecutionTime() != null
							&& triggerContext.lastCompletionTime() != null) {
						taskCronerLog.setScheduleDate(triggerContext.lastScheduledExecutionTime());
						taskCronerLog.setRunDate(triggerContext.lastActualExecutionTime());
						taskCronerLog.setFinishDate(triggerContext.lastCompletionTime());
						// 写入下次计划执行日期。
						taskCronerLog.setNextDate(nextExec);
						// 入库
						taskAPI.sendTaskCronerLog(taskCronerLog);
					}
				}
				return nextExec;
			}
		});
	}

	/**
	 * 运行任务
	 */
	public abstract String runTask() throws TaskException;

	/**
	 * 初始化配置信息。
	 */
	public abstract TaskCronerConfig initConfig();

	/**
	 * 初始化联系人信息。
	 * @return
	 */
	public abstract TaskContact initContact();

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy