# Task in Java ee



## OnDemand (2. Mrz 2015)

Hallo zusammen, ich überlege mir gerade wie ich folgendes implementieren soll.

Mehrere User sind in einer Datenbank. Ebenfalls gibt es eine Datenbank mit Verkaufspreisen. Nun soll ein Task automatisch jede Stunde für jeden User eine eigene Datei erstellen und darin userspezifische Preise aus der datenbank speichern (Preise ändern sich da jeder User andere Konditionen)

Wie kann ich es erreichen, dass mein Programm so schlau wird und 'so lange für jeden Kunden eine Datei speichert, so lange er Kunden in der Datenbank findet' 

Weiß nicht wie ich es implementien soll. Macht man das mit threads? für jeden User einen thread starten oder gibt's da noch andere Variante?


----------



## stg (3. Mrz 2015)

Ich sehe kein Problem, welches irgendwas mit Java EE zu tun hat...
Du startest in deiner Anwendung einen Scheduler, der jede Stunde eine Methode anstößt. In dieser liest du eine Collection aller User aus, für die diese Datei erstellt werden soll. Dann iterierst du über die Collection und erstellst besagte Datei.


----------



## OnDemand (3. Mrz 2015)

Moin, ok. Ist schon mal ein Anfang. Danke!  Glaube aber dass es so recht unübersichtlich wird. Jeder User hat in der Datenbank noch sagen wir 10 Werte, welche für die Preisberechnung benutzt werden. Das heißt es müssen auch die Werte in die Collection... Aber während ich so schreibe hab ich ne Idee, dass es doch so klappen könnte...

Bezgl. dem Scheduler; Habe schon geschaut es Annotation @Scheduler mit EJB zu machen, aber das wird vom Tomcat nicht unterstützt. Bevor ich jetzt meinen Server-Provider nötige, möchte ich noch nach einer anderen Lösung suchen, die performant und zuverlässig als Timer genutzt werden kann (Java TimerTask?)

Edit: Oder sollte ich mich bemühen generell Glassfish oder was einen anderen AppServer zu nutzen um EJB Timer nutzen zu können?


----------



## stg (3. Mrz 2015)

NicoDeluxe hat gesagt.:


> Moin, ok. Ist schon mal ein Anfang. Danke!  Glaube aber dass es so recht unübersichtlich wird. Jeder User hat in der Datenbank noch sagen wir 10 Werte, welche für die Preisberechnung benutzt werden. Das heißt es müssen auch die Werte in die Collection...



Wieso sollte das unübersichtlich werden? Und nein, in den Scheduler kommt die File-Generierung und sonstiger Spaß gar nicht rein. Nicht einmal die genaue Struktur eines Users.
Und mit JEE hat das wie gesagt auch erstmal nicht viel zu tun. Ich meinte das so: Erstelle einfach ein Runnable-Object und überschreibe die run-Methode


```
public class FileScheduler implemets Runnable {
    // ...
    @Override public void run() {
        Collection<User> user = UserService.getUser();
        for(User u : user) {
            FileService.printFile(MyUtilities.generateFile(u));
        }
    }
}
```

Entsprechende Scheduler-Klassen, die dein Runnable verwalten, findest du z.B. in java.util.concurrent.

Wie UserService und FileService genau aussehen, und wie sie hier verfügbar gemacht werden, hängt natürlich von deiner genauen Architektur ab, eine entsprechende Utility-Methode, welche für einen entsprechenden User das File genriert, musst du aber ja so oder so schreiben


----------



## OnDemand (3. Mrz 2015)

Irre, danke! Ich denke manchmal viel zu kompliziert, dass muss ich mir abgewöhnen 

Aber was mir noch einfällt... Solche sachen, die (eigentlich nix mit EE zu tun haben) Gehört das mit in das eigentliche Web-Projekt oder sollte das zb. als Konsolenprogramm seperat auf dem Server laufen? (dann könnte man auch den Cron/Task des OS nutzen)


----------



## stg (3. Mrz 2015)

Das kannst du halten, wie du willst. Bzw hat beides Bor- und Nachteile. Eine zusätzliche Anwendung bedeutet natürlich Overhead was Speicher, CPU, evtl duplzierter Code usw bedeutet. Ist aber natürluch auch ausfallsicherer.
Läuft Scheduler in deiner Web app, so kannst du ihn auch direkt aus der web app leichter verwalten...


----------



## OnDemand (3. Mrz 2015)

ok, wenn ich meinen Scheduler habe, startet dieser dann auch automatisch mit dem deployen der App? Wenn nicht, muss er angestoßen werden und wie?  Stimmt, wenn es in der App ist, kann der User auch manuell anstoßen, dass die Datei erstellt werden soll. Wenn es außerhalb der Web-app läuft ist das sicher nicht so einfach machbar richtig?


----------



## Steven Hachel (9. Mrz 2015)

Hey Nico,

du musst die Bean mit der @Startup Annotation versehen, damit sie nach dem deployen automatisch startet.
Ansonsten muss die Bean per Aufrzf initiiert werden.

viele Grüße
Steven


----------

