Java에서 주기적 작업을 예약하는 방법은 무엇입니까?
고정 된 시간 간격으로 작업이 실행되도록 예약해야합니다. 긴 간격 (예 : 8 시간마다)을 지원하여이 작업을 수행하려면 어떻게해야합니까?
현재을 사용하고 java.util.Timer.scheduleAtFixedRate
있습니다. java.util.Timer.scheduleAtFixedRate
오랜 시간 간격을 지원 합니까 ?
ScheduledExecutorService를 사용하십시오 .
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS);
당신은에보고해야 석영 은 EE 및 SE 버전에서 작동하고 특정 시간을 실행하는 작업을 정의 할 수 있습니다 느릅 나무 자바 프레임 워크의
이 방법으로 시도->
먼저 작업을 실행하는 TimeTask 클래스를 만듭니다.
public class CustomTask extends TimerTask {
public CustomTask(){
//Constructor
}
public void run() {
try {
// Your task process
} catch (Exception ex) {
System.out.println("error running thread " + ex.getMessage());
}
}
}
그런 다음 메인 클래스에서 작업을 인스턴스화하고 지정된 날짜까지 주기적으로 시작합니다.
public void runTask() {
Calendar calendar = Calendar.getInstance();
calendar.set(
Calendar.DAY_OF_WEEK,
Calendar.MONDAY
);
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 40);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Timer time = new Timer(); // Instantiate Timer Object
// Start running the task on Monday at 15:40:00, period is set to 8 hours
// if you want to run the task immediately, set the 2nd parameter to 0
time.schedule(new CustomTask(), calendar.getTime(), TimeUnit.HOURS.toMillis(8));
}
AbstractScheduledService
아래와 같이 Google Guava 를 사용하십시오 .
public class ScheduledExecutor extends AbstractScheduledService
{
@Override
protected void runOneIteration() throws Exception
{
System.out.println("Executing....");
}
@Override
protected Scheduler scheduler()
{
return Scheduler.newFixedRateSchedule(0, 3, TimeUnit.SECONDS);
}
@Override
protected void startUp()
{
System.out.println("StartUp Activity....");
}
@Override
protected void shutDown()
{
System.out.println("Shutdown Activity...");
}
public static void main(String[] args) throws InterruptedException
{
ScheduledExecutor se = new ScheduledExecutor();
se.startAsync();
Thread.sleep(15000);
se.stopAsync();
}
}
If you have more services like this, then registering all services in ServiceManager will be good as all services can be started and stopped together. Read here for more on ServiceManager.
If you want to stick with java.util.Timer
, you can use it to schedule at large time intervals. You simply pass in the period you are shooting for. Check the documentation here.
If your application is already using Spring framework, you have Scheduling built in
I use Spring Framework's feature. (spring-context jar or maven dependency).
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTaskRunner {
@Autowired
@Qualifier("TempFilesCleanerExecution")
private ScheduledTask tempDataCleanerExecution;
@Scheduled(fixedDelay = TempFilesCleanerExecution.INTERVAL_TO_RUN_TMP_CLEAN_MS /* 1000 */)
public void performCleanTempData() {
tempDataCleanerExecution.execute();
}
}
ScheduledTask is my own interface with my custom method execute, which I call as my scheduled task.
Do something every one second
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
//code
}
}, 0, 1000);
Have you tried Spring Scheduler using annotations ?
@Scheduled(cron = "0 0 0/8 ? * * *")
public void scheduledMethodNoReturnValue(){
//body can be another method call which returns some value.
}
you can do this with xml as well.
<task:scheduled-tasks>
<task:scheduled ref = "reference" method = "methodName" cron = "<cron expression here> -or- ${<cron expression from property files>}"
<task:scheduled-tasks>
These two classes can work together to schedule a periodic task:
Scheduled Task
import java.util.TimerTask;
import java.util.Date;
// Create a class extending TimerTask
public class ScheduledTask extends TimerTask {
Date now;
public void run() {
// Write code here that you want to execute periodically.
now = new Date(); // initialize date
System.out.println("Time is :" + now); // Display current time
}
}
Run Scheduled Task
import java.util.Timer;
public class SchedulerMain {
public static void main(String args[]) throws InterruptedException {
Timer time = new Timer(); // Instantiate Timer Object
ScheduledTask st = new ScheduledTask(); // Instantiate SheduledTask class
time.schedule(st, 0, 1000); // Create task repeating every 1 sec
//for demo only.
for (int i = 0; i <= 5; i++) {
System.out.println("Execution in Main Thread...." + i);
Thread.sleep(2000);
if (i == 5) {
System.out.println("Application Terminates");
System.exit(0);
}
}
}
}
Reference https://www.mkyong.com/java/how-to-run-a-task-periodically-in-java/
참고URL : https://stackoverflow.com/questions/7814089/how-to-schedule-a-periodic-task-in-java
'development' 카테고리의 다른 글
더 이상 사용되지 않는 Java HttpClient-얼마나 어려울 수 있습니까? (0) | 2020.05.29 |
---|---|
분할 화면 emacs 창의 크기를 변경하는 방법? (0) | 2020.05.29 |
Java를 사용하여 기본 배열에서 최대 / 최소 값 찾기 (0) | 2020.05.29 |
Android 에뮬레이터는 검은 색 화면 외에는 아무것도 표시하지 않으며 adb 장치는 "장치 오프라인"을 표시합니다 (0) | 2020.05.29 |
자바 다중 상속 (0) | 2020.05.29 |