Ich muss eine periodische Operation (rufen Sie eine Java-Methode) in meiner Web-App (Jsp auf Tomcat). Wie kann ich das tun? Java-Daemon oder andere Lösungen?Wie kann ich einen Java-Daemon machen
Antwort
Sie könnten eine ScheduledExecutorService
für die periodische Ausführung einer Aufgabe verwenden. Wenn Sie jedoch eine komplexere Cron-ähnliche Planung benötigen, werfen Sie einen Blick auf Quartz. Insbesondere würde ich empfehlen, Quartz in conjunction with Spring zu verwenden, wenn Sie diesen Weg gehen, da es eine nettere API zur Verfügung stellt und Ihnen erlaubt, Ihre Jobfeuerung in der Konfiguration zu steuern.
ScheduledExecutorService Beispiel (aus Javadoc genommen)
import static java.util.concurrent.TimeUnit.*;
class BeeperControl {
private final ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);
public void beepForAnHour() {
final Runnable beeper = new Runnable() {
public void run() { System.out.println("beep"); }
};
final ScheduledFuture<?> beeperHandle =
scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
scheduler.schedule(new Runnable() {
public void run() { beeperHandle.cancel(true); }
}, 60 * 60, SECONDS);
}
}
Meine Operation haben keine Endzeit . Ich muss dies zum Beispiel jede Woche tun. Wie kann ich das tun? – enfix
Wenn Sie ScheduledExecutorService verwenden, müssen Sie scheduleWithFixedDelay oder scheduleAtFixedRate verwenden. Für Aufgaben, die einmal pro Woche oder zu bestimmten Zeiten des Monats ausgeführt werden, favorisiere ich Quartz, da Sie in der Konfiguration einen einfachen Cron-Ausdruck angeben können, der die genauen Zeiten beschreibt, zu denen der Job ausgeführt werden sollte. – Adamski
Adams Antwort ist direkt auf das Geld. Wenn Sie am Ende Ihre eigenen rollen (anstatt die Quarz-Route zu gehen), sollten Sie in einer ServletContextListener starten. Hier ist ein Beispiel mit java.util.Timer, das mehr oder weniger eine dumme Version des ScheduledExexutorPool ist.
public class TimerTaskServletContextListener implements ServletContextListener
{
private Timer timer;
public void contextDestroyed(ServletContextEvent sce)
{
if (timer != null) {
timer.cancel();
}
}
public void contextInitialized(ServletContextEvent sce)
{
Timer timer = new Timer();
TimerTask myTask = new TimerTask() {
@Override
public void run()
{
System.out.println("I'm doing awesome stuff right now.");
}
};
long delay = 0;
long period = 10 * 1000; // 10 seconds;
timer.schedule(myTask, delay, period);
}
}
Und dann geht dies in Ihrem web.xml
<listener>
<listener-class>com.TimerTaskServletContextListener</listener-class>
</listener>
Einfach mehr zu denken!
- 1. Wie kann ich einen Hintergrund anklickbar machen?
- 2. C++: Kann ich einen Zuweisungsoperator "explizit" machen
- 3. Wie kann ich meinen Ausdruck wie einen Tisch machen?
- 4. Kann ich einen TTreeNode unsichtbar machen?
- 5. Wie kann ich einen WebMethod-Parameter erforderlich machen?
- 6. Wie kann ich einen --einzelnen Zweigklon rückgängig machen?
- 7. Wie kann ich einen Abschnitt in NSIS machen standardmäßig deaktiviert
- 8. Wie kann ich einen scrollenden Div Hintergrund transparent machen?
- 9. Wie kann ich mit NSTimer einen Countdown machen?
- 10. Wie kann ich einen DSN in Linux machen
- 11. Wie kann ich einen Pink Noise Generator machen?
- 12. Wie kann ich einen Zeilenumbruch (Zeilenfortsetzung) in Elixir machen?
- 13. Wie kann ich einen Zeiger in C# generisch machen?
- 14. Wie kann ich einen Bereich mit CSS nicht anklickbar machen?
- 15. Wie kann ich einen jQuery Schimpfwort/schlechten Wortfilter machen?
- 16. Wie kann ich einen Teil einer Datenbank öffentlich zugänglich machen?
- 17. Wie kann ich einen Klassenkonstruktor als Funktion aufrufbar machen?
- 18. Wie kann ich einen älteren Commit HEAD in Git machen?
- 19. Wie kann ich einen beweglichen <hr> machen?
- 20. Wie kann ich einen vertikalen Slider in swift machen?
- 21. Wie kann ich einen Seitenumbruch mit itext machen
- 22. Heroku - Wie kann ich einen Schub auf Heroku rückgängig machen?
- 23. Wie kann ich einen Screenshot einer Website mit .NET machen?
- 24. Wie könnte ich einen horizontalen Pflücker machen?
- 25. Wie kann ich HotKey für Buttons machen
- 26. Wie kann ich die Google Eddystone URL-Benachrichtigung machen, um einen Ton zu machen, wenn entdeckt
- 27. Wie kann ich diesen Code eleganter machen?
- 28. Wie kann ich das in Delphi machen?
- 29. Wie kann ich diesen REGEX sauberer machen?
- 30. Wie kann ich Kalenderansicht in Swift machen
ähnlicher Beitrag http://StackOverflow.com/Questions/3053936/How-to-Execute-Task-for-Aspecific-Period-in-Java/3053971#3053971 –