新聞中心
近年來,隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,大量的計算機(jī)軟件需要進(jìn)行定時任務(wù)的管理,來判斷是否有數(shù)據(jù)需要自動提交處理等等。因此,定時任務(wù)已經(jīng)成為了Java程序員的必備技能。然而,隨著任務(wù)數(shù)量的增長,相應(yīng)的管理也變得越來越繁瑣,力求提高其效率和控制力的需求也變得日益迫切。因此,數(shù)據(jù)庫方式管理成為了一個很好的解決方案。本文旨在介紹Java定時任務(wù)的管理方式,著眼于數(shù)據(jù)庫方式管理的具體實踐。

成都一家集口碑和實力的網(wǎng)站建設(shè)服務(wù)商,擁有專業(yè)的企業(yè)建站團(tuán)隊和靠譜的建站技術(shù),10年企業(yè)及個人網(wǎng)站建設(shè)經(jīng)驗 ,為成都上1000+客戶提供網(wǎng)頁設(shè)計制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營銷型網(wǎng)站建設(shè),品牌網(wǎng)站制作,同時也為不同行業(yè)的客戶提供成都做網(wǎng)站、網(wǎng)站建設(shè)的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機(jī)械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選創(chuàng)新互聯(lián)。
一、Java定時任務(wù)的常見管理方式
1.使用Schedule類來管理任務(wù):Java官方提供了一個Schedule類,可以用于對任務(wù)的調(diào)度,該類提供了多個接口來實現(xiàn)任務(wù)的定時執(zhí)行,詳見https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledExecutorService.html。
2.使用Quartz框架管理任務(wù):Quartz是一個Java的任務(wù)調(diào)度框架,提供了強(qiáng)大的任務(wù)調(diào)度功能,支持集群、多線程調(diào)度。
3.使用Spring框架管理任務(wù):Spring框架是一個Java的應(yīng)用程序開發(fā)框架,用于簡化企業(yè)級應(yīng)用程序開發(fā),包括任務(wù)調(diào)度、面向切面編程等等。
二、為什么要采用數(shù)據(jù)庫方式管理Java定時任務(wù)?
上述三種方式無論哪種,都有其自身的特點和優(yōu)劣勢,但是這些方式均需要程序員進(jìn)行代碼實現(xiàn)和管理,一旦任務(wù)數(shù)量較多可能導(dǎo)致管理繁瑣,效率低下的問題。同時,Java應(yīng)用程序一旦停止運行,所有的任務(wù)也會隨之中斷,需要重新開始執(zhí)行,這樣很容易導(dǎo)致數(shù)據(jù)丟失,因此需要一個更為穩(wěn)定可靠的解決方案。次之,如果使用了第三方框架,需要對框架進(jìn)行熟悉,且場景過于簡單的使用方式不一定能夠滿足復(fù)雜的使用場景。在此情況下,我們可以使用數(shù)據(jù)庫方式管理Java定時任務(wù)。
三、如何采用數(shù)據(jù)庫方式管理Java定時任務(wù)?
數(shù)據(jù)庫方式管理Java定時任務(wù),需要提前創(chuàng)建好Table,這個Table中需要包括以下幾個字段:ID,TASK_NAME,TASK_TYPE,TASK_PARAM,CRON_EXPRESSION,START_TIME,END_TIME,STATE。然后再將Table映射成Java對象。如下圖所示:

任務(wù)定義表結(jié)構(gòu)
1.定時任務(wù)的核心代碼:
“`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();
}
// 創(chuàng)建 JobDetl 實例,并與 HelloJob 類綁定
JobDetl jobDetl = JobBuilder.newJob(DynamicJob.class)
.withIdentity(taskSchedulerEntity.getTaskName(), taskSchedulerEntity.getTaskType()).build();
jobDetl.getJobDataMap().put(“jobParam”, taskSchedulerEntity.getTaskParam());
// 創(chuàng)建 CronTrigger 對象,指定任務(wù)觸發(fā)的時間規(guī)則
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(taskSchedulerEntity.getCronExpression());
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(taskSchedulerEntity.getTaskName(), taskSchedulerEntity.getTaskType())
.withSchedule(cronScheduleBuilder).build();
// 創(chuàng)建 SchedulerFactory 對象
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// 獲取 Scheduler 對象
try {
Scheduler scheduler = schedulerFactory.getScheduler();
// 設(shè)置 JobDetl 和 Trigger
scheduler.scheduleJob(jobDetl, cronTrigger);
// 啟動調(diào)度器
scheduler.start();
// 修改任務(wù)狀態(tài)為正常
taskSchedulerEntity.setState(TaskStateEnum.START.getCode());
taskSchedulerDao.updateById(taskSchedulerEntity);
} catch (Exception e) {
// 修改任務(wù)狀態(tài)為異常
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();
}
// 創(chuàng)建 SchedulerFactory 對象
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
try {
Scheduler scheduler = schedulerFactory.getScheduler();
JobKey jobKey = new JobKey(taskSchedulerEntity.getTaskName(), taskSchedulerEntity.getTaskType());
scheduler.deleteJob(jobKey);
// 修改任務(wù)狀態(tài)為停止
taskSchedulerEntity.setState(TaskStateEnum.STOP.getCode());
taskSchedulerDao.updateById(taskSchedulerEntity);
} catch (SchedulerException e) {
// 修改任務(wù)狀態(tài)為異常
taskSchedulerEntity.setState(TaskStateEnum.ERROR.getCode());
taskSchedulerDao.updateById(taskSchedulerEntity);
throw new RuntimeException();
}
}
}
“`
2.任務(wù)執(zhí)行類的核心代碼:
“`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”);
// 正常的業(yè)務(wù)處理
System.out.println(“執(zhí)行動態(tài)定時任務(wù),任務(wù)參數(shù):” + jobParam);
}
}
“`
四、
Java定時任務(wù)的管理方式多種多樣,但頻繁的維護(hù)、調(diào)整和控制任務(wù)數(shù)量等問題仍然存在。數(shù)據(jù)庫方式管理Java定時任務(wù)能夠有效地解決這些問題,并且可以更好地滿足業(yè)務(wù)的需求。顯然,在生產(chǎn)環(huán)境中使用這種方式管理任務(wù)可以更大程度實現(xiàn)任務(wù)優(yōu)化,也可以根據(jù)自己需求定制更適合自己業(yè)務(wù)的方式。但是,開發(fā)人員在使用此方式管理定時任務(wù)時,需要仔細(xì)考慮任務(wù)的相關(guān)需求,進(jìn)行代碼的拆分和調(diào)整,才能更好地實現(xiàn)任務(wù)的功能,提高定時任務(wù)管理的效率。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù)!
Java中定時存儲數(shù)據(jù) 例如每隔5秒中存儲一次?;蛘呙刻斓?點存儲數(shù)據(jù)怎樣實現(xiàn)
哥們 java有一個 Quartz 這個開源框架 網(wǎng)上資源挺多的,我就不在這給你復(fù)制了。這個是專門定時調(diào)用某一程序的,我覺得挺好用。你可以看看。有事hi我
哦,看來你那模塊應(yīng)該簡單吧,Quartz挺好用的。那給你段timer的代碼吧
Timer taskTimer = new Timer(true);//java自帶定時執(zhí)行的類
taskTimer.schedule(new TimerTask()
{
public void run()
{
//這里是你要處理邏輯的地方
}
}, 0, 1000*60);
//后面0是執(zhí)行任務(wù)前的延遲時間,單位是毫秒。
//1000*60是執(zhí)行各后續(xù)任務(wù)之間的時間間隔,單位是毫秒。 也就是多長時間執(zhí)行一次。
public A extends Thread{
public void run(){
while(true){
Calendar cal=Calendar.getInstance();
int a=cal.get(Calendar.SECOND);
// 每隔五秒一次,具體你自己可以修改了
if(a%5==0){
//你要執(zhí)行的代碼
}
try{
Thread.sleep(100);
}catch(Exception e){System.err.println(e);}
}
}
}
基本原理就是通過一個線程,不斷地判斷是否到點,到了的話就執(zhí)行相應(yīng)的代碼
java里面有個定時任務(wù)(java.util.TimerTask)!
spring也封裝了一個很好的定時任務(wù)!
“* * ?”
具體可以谷歌!
希望對你有幫助!
JAVA有個timer吧 如果業(yè)務(wù)可以放到數(shù)據(jù)上的話,用數(shù)據(jù)庫的定時作業(yè)做也行
關(guān)于java定時任務(wù)
之一種方法是寫一個棗明線程,每秒運行一次,檢測當(dāng)羨枝前系統(tǒng)時間,如果是0時0分0秒,那么就把count設(shè)為1
第二種方法是用quartz框架,進(jìn)行調(diào)度,調(diào)度規(guī)則是每天0點整運行一次,運行的內(nèi)凳派告容就是把count設(shè)為1
關(guān)于java定時任務(wù)數(shù)據(jù)庫方式的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),香港虛擬主機(jī)被稱為香港虛擬空間/香港網(wǎng)站空間,或者簡稱香港主機(jī)/香港空間。香港虛擬主機(jī)特點是免備案空間開通就用, 創(chuàng)新互聯(lián)香港主機(jī)精選cn2+bgp線路訪問快、穩(wěn)定!
網(wǎng)站題目:Java定時任務(wù)——數(shù)據(jù)庫方式管理(java定時任務(wù)數(shù)據(jù)庫方式)
URL標(biāo)題:http://fisionsoft.com.cn/article/dhijhod.html


咨詢
建站咨詢
