Mam aplikację internetową wdrożoną w Tomcat. Mam w nim zestaw kodu, który sprawdza bazę danych pod kątem pewnych danych, a następnie wysyła pocztę do użytkowników w zależności od tych danych. Czy ktoś może zasugerować, jak zaplanować to w Tomcat.Jak zaplanować zadanie w Tomcat
14
A
Odpowiedz
6
To zależy od używanych bibliotek. Wiele bibliotek może to zrobić:
- Quartz/Example for Tomcat.
- Spring.
- A class from Java SE.
- Jeśli używasz GAE, spójrz na numer this.
3
Można użyć słuchacza i cron4j:
@WebListener
public class StartListener implements ServletContextListener {
@Override
public void contextInitialized(final ServletContextEvent servletContextEvent) {
Scheduler scheduler = new Scheduler();
scheduler.schedule("0 * * * *", new Task());
scheduler.start();
servletContextEvent.getServletContext().setAttribute("SCHEDULER", scheduler);
}
11
Rzeczywiście, najlepszym sposobem, aby zaplanować zadanie w Tomcat jest użycie ScheduledExecutorService. Funkcja TimeTask nie powinna być używana w aplikacjach J2E, nie jest to dobra praktyka.
Przykład z prawej sposób:
utworzyć pakiet inny, że jeden kontroler (pakiet servlet) i utworzyć nową klasę java na tym nowym pakietem jako przykład:
// your package
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class BackgroundJobManager implements ServletContextListener {
private ScheduledExecutorService scheduler;
@Override
public void contextInitialized(ServletContextEvent event) {
scheduler = Executors.newSingleThreadScheduledExecutor();
// scheduler.scheduleAtFixedRate(new DailyJob(), 0, 1, TimeUnit.DAYS);
scheduler.scheduleAtFixedRate(new HourlyJob(), 0, 1, TimeUnit.HOURS);
//scheduler.scheduleAtFixedRate(new MinJob(), 0, 1, TimeUnit.MINUTES);
// scheduler.scheduleAtFixedRate(new SecJob(), 0, 15, TimeUnit.SECONDS);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
scheduler.shutdownNow();
}
}
Po tym mogą tworzyć drugą klasę java (jeden za harmonogramem) następujące:
public class HourlyJob implements Runnable {
@Override
public void run() {
// Do your hourly job here.
System.out.println("Job trigged by scheduler");
}
}
Enjoy :)
Twierdzenie takie jak "... nie powinno być używane w aplikacjach J2E, to nie jest dobra praktyka." bez dalszego tworzenia kopii zapasowych - zgadłeś - nie jest to również dobra praktyka. – zb226
'ScheduledExecutorService' i' cron4j' są względnie lekkie i działają dobrze, jeśli masz tylko jedną instancję Tomcat. Jednak to podejście nie działa dobrze, gdy wdrażasz i uruchamiasz aplikację w środowisku klastrowym lub równoważonym obciążeniem, ponieważ ryzykujesz każdą instancję wykonującą to samo zadanie. Rozwiązania takie jak mechanizm kwarcowy mają mechanizmy na miejscu, dzięki czemu tylko jeden z działających programów planujących wykona to zadanie. – Pixelstix