通用任务定时执行实现

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 子类的执行
         */
    }

}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,900评论 19 139
  • Quartz是一个完全由java编写的功能丰富的开源作业调度库,可以集成到几乎任何Java应用程序中,小到独立应用...
    ProteanBear阅读 11,990评论 3 24
  • 博客原文 徒手翻译spring framework 4.2.3官方文档的第33章,若有翻译不当之处请指正。 定时任...
    rabbitGYK阅读 10,993评论 4 24
  • 一个有些闷热宁静的下午,在关上灯漆黑一片的放映室里,大家安静的坐在沙发里,放松的欣赏着电影。 空调冷气很足,我的额...
    皓银成长笔记阅读 1,850评论 2 3
  • 今天c语言正式结束了,开始了电学,老师带我们参观了电学工艺装饰,深有感触,看了视频,和ppt,加油吧 少年
    王淳01阅读 1,108评论 1 0

友情链接更多精彩内容