Java를 사용하고 있고 내 애플리케이션에서 서블릿을 계속 실행하고 싶지만 방법을 알 수 없습니다. 내 서블릿에는 매일 데이터베이스에서 사용자 수와 전체 데이터베이스의 총 사용자 수를 제공하는 방법이 있습니다. 그래서 서블릿을 계속해서 실행하고 싶습니다.
Java를 사용하고 있고 내 애플리케이션에서 서블릿을 계속 실행하고 싶지만 방법을 알 수 없습니다. 내 서블릿에는 매일 데이터베이스에서 사용자 수와 전체 데이터베이스의 총 사용자 수를 제공하는 방법이 있습니다. 그래서 서블릿을 계속해서 실행하고 싶습니다.
답변:
당신의 문제는 당신이 서블릿 의 목적을 오해한다는 것입니다 . HTTP 요청에 대해 조치를 취하기위한 것입니다. 매일 한 번 실행되는 백그라운드 작업 만 원합니다.
@Schedule
환경이 EJB (예 : WildFly, JBoss, TomEE, Payara, GlassFish 등과 같은 실제 Java EE 서버)를 지원하는 경우 @Schedule
대신 사용하십시오. 여기 몇 가지 예가 있어요.
@Singleton
public class BackgroundJobManager {
@Schedule(hour="0", minute="0", second="0", persistent=false)
public void someDailyJob() {
// Do your job here which should run every start of day.
}
@Schedule(hour="*/1", minute="0", second="0", persistent=false)
public void someHourlyJob() {
// Do your job here which should run every hour of day.
}
@Schedule(hour="*", minute="*/15", second="0", persistent=false)
public void someQuarterlyJob() {
// Do your job here which should run every 15 minute of hour.
}
@Schedule(hour="*", minute="*", second="*/5", persistent=false)
public void someFiveSecondelyJob() {
// Do your job here which should run every 5 seconds.
}
}
예, 그게 전부입니다. 컨테이너가 자동으로 픽업 및 관리합니다.
ScheduledExecutorService
환경이 EJB를 지원하지 않는 경우 (즉, 실제 Java EE 서버가 아니라 Tomcat, Jetty 등과 같은 베어 본 서블릿 컨테이너를 사용하지 않는 경우) ScheduledExecutorService
. 이것은 ServletContextListener
. 다음은 시작 예입니다.
@WebListener
public class BackgroundJobManager implements ServletContextListener {
private ScheduledExecutorService scheduler;
@Override
public void contextInitialized(ServletContextEvent event) {
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new SomeDailyJob(), 0, 1, TimeUnit.DAYS);
scheduler.scheduleAtFixedRate(new SomeHourlyJob(), 0, 1, TimeUnit.HOURS);
scheduler.scheduleAtFixedRate(new SomeQuarterlyJob(), 0, 15, TimeUnit.MINUTES);
scheduler.scheduleAtFixedRate(new SomeFiveSecondelyJob(), 0, 5, TimeUnit.SECONDS);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
scheduler.shutdownNow();
}
}
직업 클래스는 다음과 같습니다.
public class SomeDailyJob implements Runnable {
@Override
public void run() {
// Do your daily job here.
}
}
public class SomeHourlyJob implements Runnable {
@Override
public void run() {
// Do your hourly job here.
}
}
public class SomeQuarterlyJob implements Runnable {
@Override
public void run() {
// Do your quarterly job here.
}
}
public class SomeFiveSecondelyJob implements Runnable {
@Override
public void run() {
// Do your quarterly job here.
}
}
java.util.Timer
/ 사용에 대해 생각하지 마십시오.java.lang.Thread
마지막 으로 Java EE를 직접 사용 하거나 사용 하지 마십시오 . 이것은 문제의 비결입니다. 동일한 질문에 대한 JSF 관련 답변에서 자세한 설명을 찾을 수 있습니다 . 타이머를 사용하여 예약 된 작업을 위해 JSF 관리 빈에서 스레드 생성 .java.util.Timer
java.lang.Thread
ScheduledExecutorService
를 캡처 해야합니다 . run
메서드 에서 예외가 이스케이프 하면 실행기가 자동으로 실행을 중지합니다. 이것은 버그가 아닌 기능입니다. 문서를 읽고 인터넷 검색을 통해 공부하세요.
scheduler.shutdownNow()
예제에 따라 올바르게 호출되지 않으면 발생합니다 . 이것이 호출되지 않으면 스케줄 스레드가 실제로 계속 실행됩니다.
정기적으로 작업을 실행하려면 Quartz와 같은 라이브러리를 사용하는 것이 좋습니다. 서블릿은 실제로 무엇을합니까? 보고서를 보내나요?
두 개의 클래스를 구현 startTask()
하고 main
.
public void startTask()
{
// Create a Runnable
Runnable task = new Runnable() {
public void run() {
while (true) {
runTask();
}
}
};
// Run the task in a background thread
Thread backgroundThread = new Thread(task);
// Terminate the running thread if the application exits
backgroundThread.setDaemon(true);
// Start the thread
backgroundThread.start();
}
public void runTask()
{
try {
// do something...
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
cron4j를 사용할 수 있습니다. http://www.sauronsoftware.it/projects/cron4j/manual.php