Java定时任务——数据库方式管理 (java定时任务数据库方式)

近年来,随着互联网技术的不断发展,大量的计算机软件需要进行定时任务的管理,来判断是否有数据需要自动提交处理等等。因此,定时任务已经成为了Java程序员的必备技能。然而,随着任务数量的增长,相应的管理也变得越来越繁琐,力求提高其效率和控制力的需求也变得日益迫切。因此,数据库方式管理成为了一个很好的解决方案。本文旨在介绍Java定时任务的管理方式,着眼于数据库方式管理的具体实践。

一、Java定时任务的常见管理方式

1.使用Schedule类来管理任务:Java官方提供了一个Schedule类,可以用于对任务的调度,该类提供了多个接口来实现任务的定时执行,详见https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledExecutorService.html。

2.使用Quartz框架管理任务:Quartz是一个Java的任务调度框架,提供了强大的任务调度功能,支持集群、多线程调度。

3.使用Spring框架管理任务:Spring框架是一个Java的应用程序开发框架,用于简化企业级应用程序开发,包括任务调度、面向切面编程等等。

二、为什么要采用数据库方式管理Java定时任务?

上述三种方式无论哪种,都有其自身的特点和优劣势,但是这些方式均需要程序员进行代码实现和管理,一旦任务数量较多可能导致管理繁琐,效率低下的问题。同时,Java应用程序一旦停止运行,所有的任务也会随之中断,需要重新开始执行,这样很容易导致数据丢失,因此需要一个更为稳定可靠的解决方案。次之,如果使用了第三方框架,需要对框架进行熟悉,且场景过于简单的使用方式不一定能够满足复杂的使用场景。在此情况下,我们可以使用数据库方式管理Java定时任务。

三、如何采用数据库方式管理Java定时任务?

数据库方式管理Java定时任务,需要提前创建好Table,这个Table中需要包括以下几个字段:ID,TASK_NAME,TASK_TYPE,TASK_PARAM,CRON_EXPRESSION,START_TIME,END_TIME,STATE。然后再将Table映射成Java对象。如下图所示:

![image.png](https://cdn.nlark.com/yuque/0/2023/png/21884493/1659559992261-2a1718d7-2f2b-45b0-9236-8e6bb5728596.png)

任务定义表结构

1.定时任务的核心代码:

“`java

@Service

public class TaskSchedulerServiceImpl implements TaskSchedulerService {

@Autowired

private TaskSchedulerDao taskSchedulerDao;

@Override

public void schedule(String taskName, String taskType, String taskParam, String cronExpression) {

TaskSchedulerEntity taskSchedulerEntity = new TaskSchedulerEntity();

taskSchedulerEntity.setTaskName(taskName);

taskSchedulerEntity.setTaskType(taskType);

taskSchedulerEntity.setTaskParam(taskParam);

taskSchedulerEntity.setCronExpression(cronExpression);

taskSchedulerDao.insert(taskSchedulerEntity);

}

@Override

public void start(Long taskId) {

TaskSchedulerEntity taskSchedulerEntity = taskSchedulerDao.selectById(taskId);

if (taskSchedulerEntity == null) {

throw new RuntimeException();

}

// 创建 JobDetl 实例,并与 HelloJob 类绑定

JobDetl jobDetl = JobBuilder.newJob(DynamicJob.class)

.withIdentity(taskSchedulerEntity.getTaskName(), taskSchedulerEntity.getTaskType()).build();

jobDetl.getJobDataMap().put(“jobParam”, taskSchedulerEntity.getTaskParam());

// 创建 CronTrigger 对象,指定任务触发的时间规则

CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(taskSchedulerEntity.getCronExpression());

CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(taskSchedulerEntity.getTaskName(), taskSchedulerEntity.getTaskType())

.withSchedule(cronScheduleBuilder).build();

// 创建 SchedulerFactory 对象

SchedulerFactory schedulerFactory = new StdSchedulerFactory();

// 获取 Scheduler 对象

try {

Scheduler scheduler = schedulerFactory.getScheduler();

// 设置 JobDetl 和 Trigger

scheduler.scheduleJob(jobDetl, cronTrigger);

// 启动调度器

scheduler.start();

// 修改任务状态为正常

taskSchedulerEntity.setState(TaskStateEnum.START.getCode());

taskSchedulerDao.updateById(taskSchedulerEntity);

} catch (Exception e) {

// 修改任务状态为异常

taskSchedulerEntity.setState(TaskStateEnum.ERROR.getCode());

taskSchedulerDao.updateById(taskSchedulerEntity);

throw new RuntimeException();

}

}

@Override

public void stop(Long taskId) {

TaskSchedulerEntity taskSchedulerEntity = taskSchedulerDao.selectById(taskId);

if (taskSchedulerEntity == null) {

throw new RuntimeException();

}

// 创建 SchedulerFactory 对象

SchedulerFactory schedulerFactory = new StdSchedulerFactory();

try {

Scheduler scheduler = schedulerFactory.getScheduler();

JobKey jobKey = new JobKey(taskSchedulerEntity.getTaskName(), taskSchedulerEntity.getTaskType());

scheduler.deleteJob(jobKey);

// 修改任务状态为停止

taskSchedulerEntity.setState(TaskStateEnum.STOP.getCode());

taskSchedulerDao.updateById(taskSchedulerEntity);

} catch (SchedulerException e) {

// 修改任务状态为异常

taskSchedulerEntity.setState(TaskStateEnum.ERROR.getCode());

taskSchedulerDao.updateById(taskSchedulerEntity);

throw new RuntimeException();

}

}

}

“`

2.任务执行类的核心代码:

“`java

public class DynamicJob implements Job {

@Override

public void execute(JobExecutionContext context) throws JobExecutionException {

JobDataMap dataMap = context.getJobDetl().getJobDataMap();

String jobParam = (String) dataMap.get(“jobParam”);

// 正常的业务处理

System.out.println(“执行动态定时任务,任务参数:” + jobParam);

}

}

“`

四、

Java定时任务的管理方式多种多样,但频繁的维护、调整和控制任务数量等问题仍然存在。数据库方式管理Java定时任务能够有效地解决这些问题,并且可以更好地满足业务的需求。显然,在生产环境中使用这种方式管理任务可以更大程度实现任务优化,也可以根据自己需求定制更适合自己业务的方式。但是,开发人员在使用此方式管理定时任务时,需要仔细考虑任务的相关需求,进行代码的拆分和调整,才能更好地实现任务的功能,提高定时任务管理的效率。

相关问题拓展阅读:

  • Java中定时存储数据 例如每隔5秒中存储一次。或者每天的6点存储数据怎样实现
  • 关于java定时任务

Java中定时存储数据 例如每隔5秒中存储一次。或者每天的6点存储数据怎样实现

哥们 java有一个 Quartz 这个开源框架 网上资源挺多的,我就不在这给你复制了。这个是专门定时调用某一程序的,我觉得挺好用。你可以看看。有事hi我

哦,看来你那模块应该简单吧,Quartz挺好用的。那给你段timer的代码吧

Timer taskTimer = new Timer(true);//java自带定时执行的类

taskTimer.schedule(new TimerTask()

{

public void run()

{

//这里是你要处理逻辑的地方

}

}, 0, 1000*60);

//后面0是执行任务前的延迟时间,单位是毫秒。

//1000*60是执行各后续任务之间的时间间隔,单位是毫秒。 也就是多长时间执行一次。

public A extends Thread{

public void run(){

while(true){

Calendar cal=Calendar.getInstance();

int a=cal.get(Calendar.SECOND);

// 每隔五秒一次,具体你自己可以修改了

if(a%5==0){

//你要执行的代码

}

try{

Thread.sleep(100);

}catch(Exception e){System.err.println(e);}

}

}

}

基本原理就是通过一个线程,不断地判断是否到点,到了的话就执行相应的代码

java里面有个定时任务(java.util.TimerTask)!

spring也封装了一个很好的定时任务!

“* * ?”

具体可以谷歌!

希望对你有帮助!

JAVA有个timer吧 如果业务可以放到数据上的话,用数据库的定时作业做也行

关于java定时任务

之一种方法是写一个枣明线程,每秒运行一次,检测当羡枝前系统时间,如果是0时0分0秒,那么就把count设为1

第二种方法是用quartz框架,进行调度,调度规则是每天0点整运行一次,运行的内凳派告容就是把count设为1

关于java定时任务数据库方式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

香港服务器首选树叶云,2H2G首月10元开通。
树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/261121.html<

(0)
管理的头像管理
上一篇2025-05-03 11:45
下一篇 2025-05-03 11:46

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注