# Cronjob mit Tomcat starten ?



## angelika_m (28. Jun 2007)

Hallo, 

ich schreibe zur Zeit eine Webanwendung in Struts.
Die Anwendung soll jede Stunde eine Methode ausführen. Hierfür benötige ich ein Cronjob. 

Da ich keine externe Dienste nutzen möchte, würde ich gerne den cronjob in meine Anwendung implementieren.

Durch die Suche bin ich recht schnell auf cron4j gestoßen. Ein crontab lässt sich mit cron4j sehr einfach realisieren.  Jedoch muss ich das Ganze per Hand einmal zum laufen bringen.

Frage: Wie kann ich beim starten von Tomcat, cron4j zum laufen bringen? 
Wenn Tomcat gestartet wird, muss cron4j jede Stunde seine arbeit machen, bis Tomcat gestopt wird.

Ist mein Vorhaben mit cron4j eine Klasse realisierbar ? Gibt es eine andere Möglichkeit, mein Vorhaben zu realisierne ?

Gruß
Angelika


----------



## Rydl (29. Jun 2007)

wie wird cron4j denn normalerweise gestartet? würde auf anhieb vorschlagen, eine init methode eines servlets zu missbrauchen und von dort aus das programm zu starten.


----------



## Guest (29. Jun 2007)

Hallo Rydl,

anbei führe ich das Beispiel aus der cron4j Quickstart auf.
mit deine Kurzbeschreibung kann ich auf Anhieb nicht viel anfangen. Muss mich erst einmal schlau machen 

Gruß
Angelika



```
public class HelloWorldTask implements Runnable {

	public void run() {
		System.out.println("Hello, World!");
	}

}

The following example runs HelloWorldTask once every minute for 5 minutes:

import it.sauronsoftware.cron4j.Scheduler;

public class TestScheduler {

	public static void main(String[] args) throws Throwable {
		Scheduler scheduler = new Scheduler();
		scheduler.schedule("* * * * *", new HelloWorldTask());
		scheduler.start();
		Thread.sleep(300000); // pause the main thread for 5 minutes
		scheduler.stop();
	}

}
```


----------



## Rydl (29. Jun 2007)

mh, scheint jetzt nicht so kompliziert zu sein. ich erläuter dir mal meinen lösungsansatz:

die init methode eines servlets, wird immer genau ein mal, beim ersten start des servlets aufgerufen. dieser findet entweder dann statt, wenn der erste user über dieses servlet geleitet wird oder wenn du in der web.xml einen parameter übergibst, der das servlet zusammen mit dem tomcat startet. 


```
<servlet>
		<servlet-name>MainServlet</servlet-name>
		<servlet-class>paket.MainServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>MainServlet</servlet-name>
		<url-pattern>/blabla</url-pattern>
	</servlet-mapping>
```

load-on-startup auf 1 bedeutet, dass dieses servlet das erste ist, das gestartet wird. 

in dem MainServlet, das ich jetzt hier habe, muss die init methode überschrieben werden. in deinem fall sähe das so aus:


```
public void init(){

      Scheduler scheduler = new Scheduler();
      scheduler.schedule("* * * * *", new HelloWorldTask());
      scheduler.start();
}
```

Thread.sleep(300000); würde ich dann nicht aufrufen, da dein tomcat sonst nicht mehr so richtig arbeitet...


----------



## angelika_m (29. Jun 2007)

Hallo Rydl, 

Danke für die ausführliche Beschreibung und das Beispiel !  

Ich habe das Ganze zum Schluß folgendermaßen realisiert. 


```
import it.sauronsoftware.cron4j.Scheduler;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class Cronjob implements ServletContextListener {    
    private Scheduler scheduler = null;
    public void contextInitialized(ServletContextEvent event) {
        scheduler = new Scheduler();
	scheduler.schedule("* * * * *", new HelloWorldTask());        
        scheduler.start();
    }
    public void contextDestroyed(ServletContextEvent event) {
        scheduler.stop();
        scheduler = null;
    }
} 

class HelloWorldTask implements Runnable {

	public void run() {
		System.out.println("Hello, World!");
	}

}
```

innerhalb von web.xml habe ich den folgenden Eintrag vorgenommen:


```
<listener>
        <listener-class>manager.Cronjob</listener-class>
</listener>
```


Gruß
Angelika


----------

