2010-03-23 9 views
23

Ich bin daran interessiert, eine eigenständige Spring-Anwendung zu erstellen, die ausgeführt wird und auf den Empfang von Nachrichten aus einer ActiveMQ-Warteschlange mit Spring JMS wartet. Ich habe viele Orte gesucht und kann keine einheitliche Methode finden, die Hauptmethode für solch eine eigenständige Anwendung zu implementieren. Es scheint nur wenige Beispiele für eigenständige Spring-Anwendungen zu geben. Ich habe Tomcat, JBoss, ActiveMQ und andere Beispiele aus dem Internet angeschaut, aber ich bin noch nicht zu einer Schlussfolgerung gekommen.Was sollte die Java-Hauptmethode für eine eigenständige Anwendung (für Spring JMS) sein?

Was ist die beste Praxis für die Implementierung einer Hauptmethode für eine Java-Anwendung (speziell Spring mit JMS)?

aktualisieren: Hier ist ein Beispiel aus: http://forum.springsource.org/showthread.php?t=48197 Ist dies der beste Weg, dies zu tun?

public static void main(String args[]) { 
     try { 
      ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 
      . . . . . 
      Object lock = new Object(); 
      synchronized (lock) { 
       lock.wait(); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
} 

Antwort

-4

Ein Lesevorgang in einer Schleife versuchen. Wenn eine Nachricht gefunden wird, verarbeiten Sie sie, dann schlafen Sie und iterieren Sie erneut. Fügen Sie auch eine Art Terminator-Logik ein (unterbrechen Sie den Thread). Sie könnten nach X Versuchen, aus einer Datei lesen beenden, die JVM töten, einen Terminator msg aus der Warteschlange lesen, etc., etc.

public static void main(String[] args) { 
    while(true) { 
     // look for some terminator 
     // attempt to read off queue 
     // process message 
     try { 
      TimeUnit.SECONDS.sleep(5); 
     } catch (Exception e) { 
      break; 
     } 
    } 
} 
+0

ich falsch sein, aber ich denke, das Performance-Probleme in zwei Flecken verursacht: 1. Die Verarbeitung ständig while-Schleife verbrauchen würde Prozessor. 2. Der Schlaf würde eine Verzögerung bei der Verarbeitung von Nachrichten verursachen (nicht so sehr ein Problem, da das Framework dies handhabt). Ich denke, die Antwort wird die Sperrung der Hauptmethode beinhalten, aber ich bin mir nicht sicher. – Brandon

+0

er fragte nach einer Lösung auf Federbasis ... –

+0

Wusste nicht, 'Was ist die beste Praxis für die Implementierung einer Hauptmethode für eine Java-Anwendung 'hatte etwas mit Spring zu tun. Wenn seine Frage "Wie erhalte ich eine Bean aus einer Spring-Konfiguration" lautet, wäre Ihre Antwort großartig. – Droo

-2

In Ihrem main() etwas tun, wie folgt aus:

// gather config files 
String[] configs = { "classpath:applicationContext-myutil.xml" }; 

// create the app context 
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(configs); 

// obtain reference to your utility bean 
MyUtilityBean utility = (MyUtilityBean) ctx.getBean("utility"); 

// invoke methods on your utility bean 
utility.doSomething() 

Sie würden Ihre Utiltity Bean mit Spring's JMS template injizieren, um die Gruntwork für Ihren Anwendungsfall zu tun.

+1

Ich denke, ich denke an etwas in dieser Richtung: http://forum.springsource.org/showthread.php?t=48197, weil die Bean-Methode ist Hinweis, die Ausführung von alles ist nur auf den Empfang von Nachrichten warten. – Brandon

+0

Was hat dies mit Hauptmethoden in Java-Anwendungen zu tun? – Droo

+0

Ich habe ein Update zur Verfügung gestellt. Ich denke, die Frage war implizit. – Brandon

3

Dies ist, was wir haben, innerhalb app-context.xml wir Feder JMS-Klassen wie (org.springframework.jms.listener.DefaultMessageListenerContainer verwenden Anzahl von Verbrauchern zu verwalten und benutzerdefinierte Zuhörer mit org.springframework.jms bieten .listener.adapter.MessageListenerAdapter)

app-context.xml enthält alle Spring-Beans Listeners und andere Sachen, der Code unten ist Bootstrapping Spring stellte Listener auf Warteschlangen. Idee ist es, Spring-Klassen zu verwenden, um mehrere Konsumenten zu verwalten. Lassen Sie mich wissen, ob Sie das brauchen und weitere Informationen zum Konfigurieren von MessageListenerAdapter benötigen.

+0

Dies ist, was ich auch verwende ... – arrehman

1

Die Hauptidee besteht darin, den Haupt-Thread warten zu lassen, bis die App fertig ist. while (! Finished) ist die richtige Art zu warten, bis der Haupt-Thread aufwacht.

finishEventHandler - ist eine Methode, die das Ereignis finish/quit behandelt.

Ich denke, dass JMS-Initialisierung in Spring conf getan wird. und in ". . . . ." Sektion.

public static void main(String args[]) { 

try { 
     ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 
     lock = new Object(); 

     while(!finished) { 
      synchronized (lock) { 
       lock.wait(); 
      } 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

}

public void finishEventHandler() { 
    finished = true; 
    lock.notify(); 
} 
24

Wenn mit Spring JMS Sie bereits Komponenten verwenden/Bohnen in Ihrer Konfiguration, die automatisch gestartet erhalten und wird am Leben bleiben (subscribe und aus der Warteschlange/Thema lesen) bis zum Anschlag Anwendung.

Um die Anwendung zu starten und zu behalten, sollte das Laden des Anwendungskontexts daher ausreichend sein. Gute Praxis ist aber auch das registerShutdownHook aufzurufen, also bei einem Anwendungshalt (i.e über ctrl + c in der Konsole), sind al Ihre Bohnen ordnungsgemäß herunterzufahren und entsorgt :)

public static void main(String args[]) { 
    AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 
    context.registerShutdownHook(); 
} 
+3

Für Leute, die nach Klassen-Config-Methode (vs XML) suchen, können Sie [AnnotationConfigApplicationContext] (http: // static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/context/annotation/AnnotationConfigApplicationContext.html). Ich habe hier ein Beispiel http://stackoverflow.com/a/15914136/311525. – Scott

Verwandte Themen