2011-02-11 10 views
14

Sto avendo un problema con la seguente configurazione:Come limitare il numero di istanze MDB l'ascolto di una coda JMS Jboss

applicazione

Un Java invia un'email msg a una coda JMS, poi un MDB ascoltando la coda ricevi il messaggio email con il metodo onMessage, apre una connessione su Gmail SMTP, invia l'email allo SMTP e chiude la connessione. Fare questo su tutti i messaggi nella coda JMS.

Sta funzionando benissimo quando ho fino a 5 messaggi nella coda allo stesso tempo. Tutti i messaggi vengono prelevati nello stesso momento da 5 diverse istanze di MDB, quindi ho 5 connessioni simultanee al server SMTP di Gmail. Ma quando ci sono più messaggi nella coda JMS, ricevo un errore di connessione dal server SMTP di Gmail. I primi 5 messaggi vengono inviati correttamente, ma non il resto del gruppo, quindi gli altri messaggi vengono persi perché non sono più nella coda.

Quindi la mia domanda è, è possibile limitare il numero di istanza MDB che ascolterà la coda JMS? Se ho un massimo di 5 MDB, anche se ho 1000 messaggi in coda, ci vorrà più tempo per svuotare la coda, ma almeno non perderò alcun messaggio.

Qualsiasi altro suggerimento per risolvere questo problema sarebbe molto apprezzato.

Ecco la versione Jboss:

[Server] ID di rilascio: JBoss [Trinity] 4.2.3.GA (build: SVNTag = JBoss_4_2_3_GA date = 200807181417)

e la configurazione del MDB è il seguente:

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

Avete bisogno di più?

Grazie

EDIT 2011-02-14
forse mi tutto sbagliato voler limitare il numero di istanza MDB. Ho visto una configurazione sul numero di thread JMS. Se limito il numero di thread che invierà all'MDB, forse risolverà il mio problema? Il JMS attenderà che sia disponibile un MDB prima di inviare nuovamente msg? C'è qualche effetto collaterale per farlo? Il tuo però per favore. Grazie
FINE EDIT

+0

Quale versione di JBoss? Come appare la tua configurazione MDB? – skaffman

+0

@skaffman: la versione di Jboss è: [Server] ID rilascio: JBoss [Trinity] 4.2.3.GA (build: SVNTag = JBoss_4_2_3_GA date = 200807181417) e la configurazione dell'MDB è la seguente: @MessageDriven ( activationConfig = { @ActivationConfigProperty ( propertyName = "destinationType", propertyValue = "javax.jms.Queue" ), @ActivationConfigProperty ( propertyName = "destinazione", propertyValue = "coda/emailQueue") } ) Occorrono maggiori? Grazie – Alain

+0

Aggiungere le informazioni per la questione, non è leggibile una volta inviati come un commento – skaffman

risposta

14

Prova una proprietà acitivation configurazione aggiuntiva:

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

dove someNumber è il numero massimo di istanze che si desidera.

+0

Penso che dovrebbe essere maxSessions invece di maxSession.Ho provato entrambi con valore 1 e il suo invio più di uno allo stesso tempo –

+3

@LoJuego Tutte le proprietà di configurazione di attivazione supportate sono elencate in questo tutorial: http: //docs.jboss.or g/EJB3/docs/tutorial/mdb/mdb.html. maxSession è il nome della proprietà corretto. –

+0

Posso applicare proprietà simili su WebLogic? –

0

Se JBoss 4 dispone di un'opzione per limitare le istanze di un bean di sessione stateless, un'opzione potrebbe essere quella di spostare il codice di elaborazione dei messaggi in questo bean e passare i messaggi JMS in entrata ad esso. (IIRC ogni errore nel bean causerebbe anche il mancato riconoscimento del messaggio JMS in modo che riprovasse automaticamente).

Problemi correlati