2011-02-11 22 views
14

Mam problem z następujących ustawień:Jak ograniczyć liczbę wystąpień MDB słuchania JBoss JMS kolejki

aplikacja

Java wysłać e-mail wiad do kolejki JMS, wówczas MDB słuchanie kolejce pobierz wiadomość e-mail z metodą onMessage, otwórz połączenie w SMTP Gmaila, wyślij wiadomość e-mail do SMTP i zamknij połączenie. Robi to dla wszystkich wiadomości w kolejce JMS.

Świetnie się sprawdza, gdy mam jednocześnie do 5 wiadomości w kolejce. Wszystkie wiadomości są odbierane w tym samym czasie przez 5 różnych instancji MDB, więc mam 5 równoczesnych połączeń z serwerem Gmail SMTP. Ale gdy w kolejce JMS jest więcej wiadomości, pojawia się błąd połączenia z serwera SMTP Gmaila. 5 pierwszych wiadomości jest wysyłanych poprawnie, ale nie pozostałe, więc inne wiadomości są tracone, ponieważ nie są już w kolejce.

Moje pytanie brzmi: czy można ograniczyć liczbę instancji MDB, które będą nasłuchiwać w kolejce JMS? Jeśli mam maksymalnie 5 MDB, to nawet jeśli mam 1000 wiadomości w kolejce, opróżnienie kolejki będzie trwało dłużej, ale przynajmniej nie stracę żadnej wiadomości.

Wszelkie inne sugestie dotyczące rozwiązania tego problemu byłyby bardzo mile widziane.

Oto wersja JBoss:

[Server] Numer wydania: JBoss [Trójcy] 4.2.3.GA (build: SVNTag = JBoss_4_2_3_GA date = 200807181417)

i config MDB jest następująca:

@MessageDriven(activationConfig = { 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/emailQueue") 
}) 

Potrzebujesz więcej?

Dzięki

EDIT 2011-02-14
Może jestem w błędzie chcąc ograniczyć liczbę instancji MDB. Widziałem konfigurację dotyczącą liczby wątków JMS. Jeśli ograniczę liczbę wątków, które będą publikowane w MDB, może to rozwiąże mój problem? Czy JMS będzie czekać, aż MDB będzie dostępne przed ponownym wysłaniem wiadomości msg? Czy jest jakiś efekt uboczny? Proszę, proszę. Dzięki
END EDIT

+0

Która wersja JBoss? Jak wygląda twoja konfiguracja MDB? – skaffman

+0

@skaffman: Wersja Jboss to: [Server] Release ID: JBoss [Trinity] 4.2.3.GA (build: SVNTag = JBoss_4_2_3_GA date = 200807181417) a konfiguracja MDB jest następująca: @MessageDriven ( activationConfig = { @ActivationConfigProperty ( propertyName = "destinationType", propertyValue = "javax.jms.Kolejka” ) @ActivationConfigProperty ( propertyName = "przeznaczenia", WartośćWłaściwości = "kolejka/emailQueue") } ) Czy trzeba więcej? Dzięki – Alain

+0

Dodanie informacji do pytania, to nie jest czytelny, gdy pisał jako komentarz: – skaffman

Odpowiedz

14

Spróbuj dodatkową właściwość acitivation config:

@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "someNumber") 

gdzie someNumber jest maksymalna liczba wystąpień chcesz.

+0

Myślę, że powinno to być maxSessions zamiast maxSession.Próbowałem zarówno z wartością 1 i wysyłania więcej niż jeden w tym samym czasie. –

+3

@LoJuego Wszystkie obsługiwane właściwości konfiguracji aktywowania są wymienione w ten samouczek: http: //docs.jboss.or g/ejb3/docs/tutorial/mdb/mdb.html. maxSession jest poprawną nazwą właściwości. –

+0

Czy mogę zastosować podobną właściwość w WebLogic? –

0

Jeśli JBoss 4 ma opcję ograniczenia wystąpień bezstanowego komponentu bean sesji, jedną z opcji może być przeniesienie kodu przetwarzania komunikatu do tego komponentu bean i przekazanie do niego przychodzących wiadomości JMS. (IIRC wszelkie niepowodzenie w komponencie bean spowoduje również, że komunikat JMS będzie niepotwierdzony, aby był ponawiany automatycznie).