2010-03-23 10 views
23

Jestem zainteresowany tworzeniem samodzielnej aplikacji Spring, która będzie uruchamiać i czekać na otrzymywanie wiadomości z kolejki ActiveMQ przy użyciu Spring JMS. Przeszukałem wiele miejsc i nie mogę znaleźć spójnego sposobu implementacji głównej metody takiej samodzielnej aplikacji. Wydaje się, że jest kilka przykładów wiosennych aplikacji autonomicznych. Spojrzałem na Tomcat, JBoss, ActiveMQ i inne przykłady z całej sieci, ale nie doszedłem do wniosku, więc ...Jaka powinna być główna metoda Java dla autonomicznej aplikacji (dla Spring JMS)?

Co to jest najlepsza praktyka w zakresie wdrażania głównej metody dla aplikacji Java (szczególnie Spring z JMS)?

Aktualizacja: Oto przykład z: http://forum.springsource.org/showthread.php?t=48197 Jest to najlepszy sposób to zrobić?

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(); 
     } 
} 

Odpowiedz

-4

Spróbuj odczytać w pętli. Jeśli wiadomość zostanie znaleziona, przetwórz ją, a następnie uśpij i powtórz ją ponownie. Wstaw tam także logikę terminatora (przerwij wątek). można zakończyć po próbach X, odczytanych z pliku, zabić JVM, czytać wiad terminatora z kolejki, 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

Może się mylę, ale myślę, że to powoduje problemy z wydajnością w dwóch miejscach: 1. Stale przetwarzania pętli while pochłonie edytor. 2. Uśpienie spowodowałoby opóźnienie w przetwarzaniu komunikatów (nie stanowiłoby to problemu, ponieważ framework to obsługuje). Myślę, że odpowiedź będzie polegała na zablokowaniu głównej metody, ale nie jestem pewien. – Brandon

+0

prosił o rozwiązanie oparte na źródle ... –

+0

Nie wiedziałem "Jaka jest najlepsza praktyka w zakresie wdrażania głównej metody dla aplikacji Java" ma coś wspólnego ze Spring. Jeśli jego pytanie brzmiało "Jak uzyskać fasolę ze Spring config", odpowiedź byłaby wspaniała. – Droo

-2

w głównym() zrobić coś takiego:

// 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() 

Możesz wstrzyknąć swoją fasolę Utiltity za pomocą Spring's JMS template, aby wykonać pomruk na swój użytek.

+1

Myślę, że myślę o czymś takim: http://forum.springsource.org/showthread.php?t=48197 ponieważ metoda bean to notatka, która wykonuje wszystko, tylko czeka na otrzymanie wiadomości. – Brandon

+0

Co to ma wspólnego z głównymi metodami w aplikacjach Java. – Droo

+0

Podałem aktualizację. Myślę, że pytanie było implicite. – Brandon

3

To, co mamy, wewnątrz app-context.xml używamy wiosenne zajęcia JMS podobne (org.springframework.jms.listener.DefaultMessageListenerContainer zarządzać liczby konsumentów i zapewnić niestandardową słuchacza za pomocą org.springframework.jms .listener.adapter.MessageListenerAdapter)

app-context.xml zawiera wszystkie detektory ziaren sprężyn i inne rzeczy, poniższy kod to ładowanie sprężynowe pod warunkiem, że słuchacze znajdują się w kolejkach. Pomysł polega więc na wykorzystaniu klas wiosennych do zarządzania wieloma klientami. Daj mi znać, jeśli to jest to, czego potrzebujesz i potrzebujesz więcej informacji na temat konfigurowania MessageListenerAdapter.

public static void main(String[] args) 
{ 

    try 
    { 
     new ClassPathXmlApplicationContext("app-context.xml"); 

    } 
    catch (Throwable e) 
    { 
     e.printStackTrace(); 
     System.exit(-1); 
    } 

} 
+0

Właśnie tego używam ... – arrehman

1

Głównym założeniem jest, aby główny wątek czekał aż aplikacja zostanie zakończona. natomiast (! Finished) jest prawidłowym sposobem oczekiwania, aż główny wątek zostanie wybudzony.

finishEventHandler - to metoda, która obsługuje zdarzenie finish/quit.

Uważam, że inicjowanie JMS odbywa się w Spring conf. i w ". . . . ." Sekcja.

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

Podczas korzystania Wiosna JMS używałeś komponenty/fasola w konfiguracji, które się automatycznie uruchomiony i będzie pozostać przy życiu (subskrybować i czytać z kolejki/temacie) do momentu zatrzymania podanie.

Aby rozpocząć i utrzymać działanie aplikacji, ładowanie pliku aplikacji powinno być wystarczające. Dobrą praktyką jest jednak również wywoływanie registerShutdownHook, więc na zatrzymanie aplikacji (i.e poprzez Ctrl + C w konsoli), inni twoi ziarna są wdziękiem zamknięcie i usuwane :)

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

Dla osób, które szukają metody konfiguracji klasy (vs XML), możesz użyć [AnnotationConfigApplicationContext] (http: // static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/context/annotation/AnnotationConfigApplicationContext.html). Mam przykład tutaj http://stackoverflow.com/a/15914136/311525. – Scott

Powiązane problemy