Bha*_*wat 7 java quartz-scheduler
我正在通过代码实现石英作业调度。下面是我安排和重新安排石英作业的方法。
void setJobSchedular(ScraperSearchOnRequest scraperSearchOnRequestInstance) {
try {
String groupName = "Scraper Group" + scraperSearchOnRequestInstance?.id
String jobName = "ScraperOnRequestJob"
Scheduler scheduler = getJobManagerService().quartzScheduler
JobKey jobKey = new JobKey(jobName, groupName);
//create JobDetail and Trigger
JobDetail jobDetail = JobBuilder.newJob(com.dogmasystems.scraper.ScraperOnRequestJob1.class).withIdentity(jobKey).build();
//add passing parameters to JobDataMap for first JobDetail
jobDetail.getJobDataMap().put("id", scraperSearchOnRequestInstance?.id?.toString());
jobDetail.getJobDataMap().put("groupName", groupName);
if (scheduler.checkExists(jobKey)) {
println("Rescheduling the old job having group name " + groupName)
Trigger oldTrigger = scheduler.getTrigger(new TriggerKey(jobName, groupName))
TriggerBuilder tb = oldTrigger.getTriggerBuilder();
Trigger newTrigger = tb.startAt(scraperSearchOnRequestInstance.scheduledTime).usingJobData("id",
scraperSearchOnRequestInstance?.id?.toString()).build()
scheduler.rescheduleJob(oldTrigger.key, newTrigger);
} else {
println("Scheduling the new job having group name " + groupName)
SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, groupName)
.startAt(scraperSearchOnRequestInstance.scheduledTime).usingJobData("id",
scraperSearchOnRequestInstance?.id?.toString()).build();
scheduler.scheduleJob(jobDetail, trigger);
}
} catch (Exception e) {
println("**********************Error in setJobSchedular for scraperOnRequestJob****************************")
e.printStackTrace("Error while setting ScraperOnRequestJob " + e.printStackTrace())
println("******************************************************")
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我的工作在指定的时间运行,并且使用上述方法工作正常。
要求:
为了停止工作,我给出了该特定工作的jobName和groupName。
void stopSchedularJob(String id) throws Exception {
String groupName = "Scraper Group" + id
String jobName = "ScraperOnRequestJob"
JobKey jobKey = new JobKey(jobName, groupName);
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, groupName);
Scheduler scheduler = getJobManagerService().quartzScheduler
Trigger trigger = scheduler.getTrigger(triggerKey)
if (trigger) {
println "Trigger key name to stop " + triggerKey.getName()
// wait long enough to see the job execution
Thread.sleep(10 * 1000); //1 minute
scheduler.unscheduleJob(triggerKey)
println "The ScraperOnRequestJob having " + groupName + " has been stopped."
} else {
println "No trigger could be found for " + triggerKey.getName()
}
}
Run Code Online (Sandbox Code Playgroud)
但它给了我错误:
Error |
2019-11-21 11:20:10,411 [http-bio-8078-exec-2] ERROR spi.SqlExceptionHelper - ERROR: canceling statement due to user request
Where: while updating tuple (0,36) in relation "scraper_search"
Error |
org.springframework.dao.DataAccessResourceFailureException: Hibernate operation: could not execute statement; SQL [n/a]; ERROR: canceling statement due to user request
Where: while updating tuple (0,36) in relation "scraper_search"; nested exception is org.postgresql.util.PSQLException: ERROR: canceling statement due to user request
Where: while updating tuple (0,36) in relation "scraper_search"
Run Code Online (Sandbox Code Playgroud)
我尝试了很多解决方案,例如
scheduler.interrupt(jobKey)
scheduler.shutdown() (我只想杀死特定的工作,而不是所有的工作)
Quartz 工作监听器
但我仍然无法找到特定的解决方案。
Yas*_*ash -1
您还可以使用计时器任务来安排任务。这样您就可以轻松地创建和终止它们。
publicabstractclassTimerTaskextendsObjectimplementsRunnable * 一种任务,可以通过定时器安排一次性或重复执行。
根据您的要求,用于Hashtable存储带有密钥的计时器对象以供将来使用。
public class TimerTasks {
public static void main(String[] args) throws SchedulerException, IOException {
Timer timerObj = new Timer();
MyTask myTask = new MyTask(); // This task is scheduled to run every 10 seconds
startTimer("T1", timerObj, myTask, 2, 10000);
System.out.println("Enter Something to stop Timer.");
System.in.read();
System.in.read();
terminateTimer("T1");
System.out.println("Main end.");
}
static Map<String, Timer> taskGroup = new Hashtable<String, Timer>();
public static String startTimer(String key, Timer timerObj, TimerTask task, long delay, long period) {
if (taskGroup.containsKey(key)) {
return "Fialure, On this key alreay timer is available.";
} else {
timerObj.scheduleAtFixedRate(task, delay, period);
// You can save multiple, from key get timer object and you can cancel.
taskGroup.put(key, timerObj);
return "Success";
}
}
public static void terminateTimer(String key) {
if (taskGroup.containsKey(key)) {
Timer timer = taskGroup.get("T1");
// This task has been cancelled (with a call to TimerTask.cancel).
timer.cancel();
taskGroup.remove(key);
}
}
}
class MyTask extends TimerTask{
public MyTask(){
//Some stuffs
}
@Override
public void run() {
System.out.println("Hi, see its Timer task.");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2040 次 |
| 最近记录: |