2013-08-14 2 views
14

У меня есть веб-приложение, развернутое в Tomcat. У меня есть набор кода, который проверяет базу данных на определенные данные и затем отправляет почту пользователям в зависимости от этих данных. Может кто-нибудь предложить, как планировать это в Tomcat.Как запланировать задачу в Tomcat

ответ

3

Вы можете использовать слушателя и 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

На самом деле, лучший способ планировать задачи в Tomcat является использование ScheduledExecutorService. TimeTask не должен использоваться в приложениях J2E, это не очень хорошая практика.

Пример с правильным образом:

создать пакет другого, что вы один контроллер (сервлет пакет), и создать новый класс Java на этом новом пакете, например:

// 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(); 
} 

} 

После этого вы может создать другой класс Java (один по графику) следующим образом:

public class HourlyJob implements Runnable { 

@Override 
public void run() { 
    // Do your hourly job here. 
    System.out.println("Job trigged by scheduler"); 
    } 
} 

Наслаждайтесь :)

+1

Требование типа «... не должно использоваться в приложениях J2E, это не очень хорошая практика». без какой-либо дополнительной поддержки, вы, как вы уже догадались, не являются хорошей практикой. – zb226

+0

'ScheduledExecutorService' и' cron4j' относительно легки и работают хорошо, если у вас есть только один экземпляр Tomcat. Однако этот подход не работает, когда вы развертываете и запускаете приложение в кластерной или балансированной нагрузке среде, поскольку вы рискуете, что каждый экземпляр запускает ту же задачу. Такие решения, как Quartz, имеют механизмы, позволяющие выполнять только одну из запущенных планировщиков. – Pixelstix

Смежные вопросы