2013-08-14 8 views
14

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

Odpowiedz

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 :)

+1

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

+0

'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