通用任务定时执行实现

Quartz触发器配置

从触发器中配置一个通用触发MainStarter

<bean id="mainStarter" class="com.zb.timer.MainStarter" >
</bean>
    
<bean id="mainStarterDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	<property name="targetObject" ref="mainStarter" />
	<property name="targetMethod" value="run" />
	<property name="concurrent" value="false" />
</bean>
<bean id="mainStarterTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
	<property name="jobDetail" ref="mainStarterDetail" />
	<property name="startDelay" value="10000" />
	<property name="repeatCount" value="0" /> 
</bean>
	
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	<property name="triggers">
		<list>
			<ref bean="mainStarterTrigger" />  
		</list>
	</property>
</bean>
复制代码

统一任务处理

MainStarter的实现

主要是任务中心来执行的

public class MainStarter{

	// 任务中心
	private TaskCenter taskCenter;
	
	public void setTaskCenter(TaskCenter taskCenter) {
		this.taskCenter = taskCenter;
	}

	public void run() {
		if(taskCenter==null) {
			taskCenter = new TaskCenterSupport();
		}
		taskCenter.run();
	}
}
复制代码
public interface TaskCenter {
	// 加载任务
	public void loadTask(Task taskTracker);
	
	public List<Task> getTasks(); 
	
	public void run();
	
	public void terminate();
	
}
复制代码

任务中心存储任务,任务 Task 为代码最终执行

public abstract class Task extends Thread {
	private boolean isAlive = true;

	@Override
	public void run() {
		while (isAlive) {
			try {
				doRun();
			} catch (Exception e) { 
				logger.error("run task error.", e);
			}
		}
	}

	public void setAlive(boolean isAlive) {
		this.isAlive = isAlive;
	}

	// 子类业务需要实现此方法,方法中为具体业务
	protected abstract void doRun() throws Exception;
}
复制代码

具体业务实现

TaskCenter 的实现类 TaskCenterSupport

public class TaskCenterSupport implements TaskCenter {
	private List<Task> tasks;
	
	public List<Task> getTasks() {
		return tasks;
	}

	public void loadTask(Task task) {
		if (tasks == null) {
			tasks = new ArrayList<>();
		}
		
		tasks.add(task);
	}
	
	public void run() {
		if(CollectionUtils.isNotEmpty(tasks)){
			for (Task task : tasks) {
				if(task != null) {
					task.setAlive(true);
					task.start();
				}
			}
		}
	}
	
	public void terminate() {
		if(CollectionUtils.isNotEmpty(tasks)){
			for (Task task : tasks) {
				if(task != null) {
					task.setAlive(false);
				}
			}
			
			tasks.clear();
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				logger.error(e.getMessage(),e);
				Thread.currentThread().interrupt();
			}
		}
	}
}
复制代码

Task 的子类 ZBTask

public class ZBTask extends Task{ 
	
	public ZBTask () {
		TaskCenter taskCenter = TaskCenterSingleton.getInstance();
		taskCenter.loadTask(this);
	}
	
	public void doRun() throws Exception {
		/* 具体业务实现,这里就能会定时执行,
		 * 若有需要还可以在此使用休眠,
		 * 这样只会把此线程挂起,不影响其他 Task 子类的执行
		 */
	}

}
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值