2009-08-27 5 views
4

Ich versuche, eine Spring-Anwendung (keine Webanwendung) zu erstellen, um einige einfache Aufgaben auszuführen. Irgendwann werden sie sich mit einigen anderen Spring-Apps im Netzwerk verbinden, aber für den Moment behalte ich es einfach. Ich habe eine CheckForNewItems-Klasse (Laufzeitverlängerung), die so konfiguriert ist, dass sie alle 10 Sekunden ausgeführt wird.Frühling: Gibt es ein einfaches Nicht-Web-Tutorial?

Ich kann bestätigen, es läuft durch sie programmatisch Aufruf:

public class Tester { 

    public static ApplicationContext context; 

    private void loadContext() { 
    String filename = "beans.xml"; 
    context = new FileSystemXmlApplicationContext(filename); 
    } 

    public static void main(String[] args) { 
    Tester test = new Tester(); 
    test.loadContext(); 
    CheckNewItemsTask task = (CheckNewItemsTask)context.getBean("checkNewItemsTask"); 
    } 
} 

Ausführen dieses wie erwartet funktioniert, task.run() wird alle 10 Sekunden aufgerufen. Jetzt muss ich herausfinden, wie ich dies auf einem JBoss- oder Tomcat-Server bereitstellen kann, sodass die Task automatisch gestartet wird.

Die meisten Tutorials, die ich gefunden habe, beschreiben nur, wie Spring MVC und Servlets ausgeführt werden, keine eigenständige Anwendung. Weiß jemand es besser?

Prost, Rob.

+0

Ich bin verwirrt; Sie möchten eine eigenständige Anwendung in einem Application Server ausführen? Das scheint mir ein Widerspruch zu sein. –

+0

Wenn ich "Standalone" sage, meine ich nicht "Web", keine Verbindung zu anderen Apps, ich sitze einfach nur da und renne selbst. –

Antwort

1

Sie benötigen ein Servlet, das bei der Bereitstellung automatisch gestartet wird. Das Servlet kann dann Ihre "Tester" -Klasse aufrufen, um Ihren "Standalone" -Initialisierungsprozess auszulösen.

Wenn Sie keinen Servlet (oder möglicherweise einen anderen Serverprozess) haben, der auf Ihren Code verweist, wird Ihr Initialisierungsvorgang nie ausgeführt.

+1

Aber sicher, ein Servlet ist ein Web-Konzept? Ich brauche nicht unbedingt Tester zu laufen, ich brauche nur die Aufgabe geladen und ausgeführt werden. –

+1

@Robert - "Aber ein Servlet ist doch ein Web-Konzept?" - Wen interessiert das? Sie scheinen hier den Punkt zu verfehlen ... es gibt viele (app-serverspezifische) Wege, Spring zu initialisieren, ohne überhaupt etwas mit dem Internet zu tun zu haben. Aber ein Servlet, das nichts anderes tut, als in Spring aufzurufen, um es initialisieren und ausführen zu lassen (und damit den Taskplaner zu starten), ist der beste Weg, solche Aufgaben generisch automatisch zu initialisieren. Servlets werden im Allgemeinen für Web-bezogene Dinge verwendet, aber das ist nicht der einzige Grund, einen zu haben. Aus genau diesem Grund habe ich zuvor BatchInitServlet-Klassen erstellt. – jsight

+2

"Wen interessiert's?" - Nun, jemand, der die Vorteile eines IoC-Containers nutzen möchte, ohne einen ganzen Servlet-Container-Stack in seine Codebasis einziehen zu müssen. @Robert: Ich würde diese [Frühjahrsdokumentation] (http://www.springbyexample.org/examples/intro-to-ioc-creating-a-spring-application.html) für Beispiele der Verwendung von Spring außerhalb eines Webstacks betrachten . – demaniak

6

Sie brauchen JBoss oder Tomcat nicht, um das zu tun. Wenn die App kopflos ist und Sie keine Absicht haben, eine Benutzeroberfläche hinzuzufügen, betrachten Sie jsvc für Unix oder procrun für Windows. Wenn Sie eine App überwachen und steuern möchten und hierfür keine geeignete Benutzeroberfläche benötigen, sollten Sie sich JMX ansehen. Dies funktioniert bei einem Daemon ohne den Rest des Java EE-Stacks.

Wenn Sie ein Maven-Projekt haben und es einfach in eine bereitstellbare Daemon-App verwandeln möchten, können Sie maven appassembler verwenden, um den Prozess zum Erstellen eines implementierbaren Daemons zu automatisieren und eine Verzeichnisstruktur der App einzurichten und halt, Bibliotheken und Konfigurationsdateien.

Verwandte Themen