2009-03-16 8 views
0

Ich habe ein Java-Servlet-Programm, das es startet, wenn Tomcat startet. Ich habe das Programm als Last beim Start erwähnt. Ich verwende keine HTTP-Anfrage oder Antwort.Servlet Programm als Dienst

Was ich brauche ist, dass ich das Programm als Dienst ausführen muss oder eine automatische Aktualisierung in bestimmten Zeitintervallen haben muss. Wie geht das? Kann mir jemand helfen?

Danke, Gopal.

+0

welche meinst du mit auto-refresh? Tomcat macht das selbst. – Tobias

Antwort

0

tomcat ein Auto jedes Mal ändert sich die WAR-Datei manchmal nicht aktualisieren

0

ich einen Timer verwenden, um in regelmäßigen Abständen macht HTTP-Anfragen:

timer = new Timer(true); 
    timer.scheduleAtFixedRate(
     new TimerTask() { 
      URL url = new URL(timerUrl); 
      public void run() { 
       try { 
        url.getContent(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, 
     period, 
     period); 
1

ich Ihnen empfehlen Quartz zu verwenden. Sie können einen geplanten Job mit Quarz definieren.

import org.quartz.Scheduler; 
import org.quartz.SchedulerException; 
import org.quartz.impl.StdSchedulerFactory; 

public class QuartzTest { 
    public static void main(String[] args) { 
    try { 
     Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 
     scheduler.start(); 

     scheduler.shutdown(); 
     } catch (SchedulerException se) { 
     se.printStackTrace(); 
     } 
    } 
} 
3

Quarz ist eine großartige Idee, aber je nach Bedarf ein bisschen Overkill. Ich denke, Ihr Problem besteht darin, Ihren Dienst in ein Servlet zu stopfen, wenn Sie nicht wirklich eingehende HttpServletRequests abhören. Stattdessen sollten Sie einen ServletContextListener verwenden Ihren Dienst zu starten, und ein Timer, wie Maurice vorgeschlagen:

web.xml:

<listener> 
    <listener-class>com.myCompany.MyListener</listener-class> 
</listener> 

Und dann sieht Ihre Klasse wie folgt:

public class MyListener implements ServletContextListener { 

    /** the interval to wait per service call - 1 minute */ 
    private static final int INTERVAL = 60 * 60 * 1000; 

    /** the interval to wait before starting up the service - 10 seconds */ 
    private static final int STARTUP_WAIT = 10 * 1000; 

    private MyService service = new MyService(); 
    private Timer myTimer; 

    public void contextDestroyed(ServletContextEvent sce) { 
     service.shutdown(); 
     if (myTimer != null) 
      myTimer.cancel(); 
    } 

    public void contextInitialized(ServletContextEvent sce) { 
     myTimer = new Timer(); 
     myTimer.schedule(new TimerTask() { 
      public void run() { 
       myService.provideSomething(); 
      } 
     },STARTUP_WAIT, INTERVAL 
    ); 
    } 
} 
+0

Quartz vs TimerTasker: Beachten Sie, dass der Timer-Mechanismus eine TimerTask-Instanz verwendet, die zwischen wiederholten Ausführungen geteilt wird, im Gegensatz zu Quartz, die für jede Ausführung eine neue Job-Instanz erstellt. – ariso