Concludiamo questo capitolo sul sistema di messaggistica JMS, parlando dei Message Driven Bean.
Un Message Driven Bean, (abbreviato MDB) è semplicemente una classe gestita da un container, che consuma messaggi accodati su una coda o un topic.
Teniamo a mente che essendo l’MDB gestito da un container, può avere diverse istanze replicate che consumano i vari messaggi accodati e scatenano delle callback che possono entrare in concorrenza l’una con l’altra, quindi deve essere lo sviluppatore a gestire ciò, ad esempio affidandosi ad un DBMS che dia determinate garanzie nel caso di transazioni concorrenti.
Un esempio classico di utilizzo di un MDB è un log appender, cioè un bean che riceve dei logs da altri componenti applicativi, e li serializza su un DB,
@MessageDriven( name="DBLogAppender", activationConfig= { @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"), @ActivationConfigProperty(propertyName="destination", propertyValue="queue/MyQueue") } ) public class LogConsumer implements MessageListener{ private static Logger logger = Logger.getLogger("DBLogAppender"); public void onMessage(Message arg0) { logger.info(arg0); }
Notiamo come abbiamo dovuto inserire delle chiavi nome-valore dentro l’annotation @MessageDriven (che informa il container sul fatto che tale classe debba essere gestita come un MDB). Tali ActivationConfigProperty, specificano il tipo di destination (Queue) e il nome JNDI, della coda dalla quale riceviamo i messaggi.
In questo caso, ad esmpio, uso un Application Server che è JBoss AS 5.1.0.GA, per registrare una coda su JNDI dobbiamo editare il file deploy/messaging/destinations-service.xml all’interno del path del nostro server di default, e inserire un mbean come segue:
<mbean code="org.jboss.jms.server.destination.QueueService" name="jboss.messaging.destination:service=Queue,name=MyQueue" xmbean-dd="xmdesc/Queue-xmbean.xml"> <depends optional-attribute-name="ServerPeer"> jboss.messaging:service=ServerPeer </depends> <depends>jboss.messaging:service=PostOffice</depends> <attribute name="JNDIName">queue/MyQueue</attribute> <attribute name="RedeliveryDelay">10000</attribute> <attribute name="MaxDeliveryAttempts">3</attribute> </mbean>
E in esso specifichiamo tra i vari parametri anche il JNDI name.
Nella logica applicativa della callback onMessage, creiamo un logger, che agganciamo tramite il nome logico “DBLogAppender”, alla classe stessa del nostro MDB. Tale logger è configurato come Log4j Appender, cioè manda ad una struttura di destinazione, i log ricevuti in un formato log4j compliant.
Immagini e codesnippets gentilmente concessi dal prof. Bellavista ed estratti dalle slides inerenti al corso di Sistemi Distribuiti M di Ingegneria Informatica, Università di Bologna, tutti i diritti riservati
Congratulations.This information is very useful. Great job!