Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 53 di 68
  • livello ninja
Indice lezioni

Message Driven Bean - Client

Un client per scrivere su una coda di messaggi e testare il message driven bean di esempio
Un client per scrivere su una coda di messaggi e testare il message driven bean di esempio
Link copiato negli appunti

Abbiamo appena creato il message driven bean, associato ad una coda, lo abbiamo installato: non ci rimane che provarlo. Quanto vedremo in questa lezione è di carattere piuttosto generale, visto che stiamo andando a definire il codice necessario ad effettuare la scrittura su una coda (operazione indipendente dalla tecnologia J2EE).

Quello che vedremo sarà il main di una classe java, che si occupa di recuperare le informazioni su un ambiente di esecuzione (dove gira l'application server), di recuperare la coda (attraverso nome JNDI) e di scriverci su dei messaggi.

Listato 1. Creazione dell'ambiente di esecuzione dell'application server

//In questo caso lo utilizziamo per recuperare (dal JNDI) il servizio
//JMS che ci consentirà di scrivere sulla coda un messaggio

Properties props=new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
props.put(Context.PROVIDER_URL, "jnp://localhost:1099");
Context ctx=new InitialContext(props);

Quest'operazione è la medesima fatta per recuperare l'ambiente di esecuzione, ma attenzione: i parametri sono settati per un'istanza di JBoss residente in locale.

...
//Creazione del factory

QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("ConnectionFactory");
//Crea la connessione verso una coda
QueueConnection conn = factory.createQueueConnection();
//Crea la sessione sulla connessione appena creata
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//Recupero la coda (attraverso il nome JNDI)
javax.jms.Queue queue = (javax.jms.Queue)ctx.lookup("queue/ConsoleWriter");
//Creazione dell'oggetto che scrive sulla coda
MessageProducer producer = session.createProducer(queue);

//Invio 5 messaggi sulla coda
producer.send(session.createTextMessage("#1 Hello World!"));
...

Quanto precede è di valenza assolutamente generale. Esso può essere usato all'interno di qualsiasi componente, anche un session bean (anzi, spesso è li che lo userete per scrivere messaggi). Le interfacce utilizzate provengono dal package javax.jms. Facendo il lookup con il nome "ConnectionFactory" recupereremo l'istanza concreta del QueueConnectionFactory, e da lì, il resto delle operazioni si spiega da solo.

La coda che vogliamo recuperare si chiama ConsoleWriter: il nome JNDI associato dall'application server è queue/ConsoleWriter. È a questa coda che è legato il message driven bean della lezione precedente.

L'esecuzione di quest'applicazione effettuerà la scrittura dei messaggi sulla coda. Il container intercetterà i messaggi ed attiverà il message driven bean in ascolto. Quest'ultimo eseguirà il metodo di logica e, nel nostro caso, scriverà su console il contenuto del messaggio ricevuto.

Nel caso in cui la tipologia di coda non è Queue, ma Topic, il codice rimane identico, basta cambiare la tipologia di interfacce da utilizzare.

Abbiamo visto come viene realizzata la lettura di messaggi da una coda tramite message driven bean. Vediamo come poterla realizzare da applicazione stand alone (e non da message driven bean). Il codice è speculare a quello scritto sopra.

...
//Creazione del factory

QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("ConnectionFactory");
//Crea la connessione verso una coda//Crea la connessione verso una coda
QueueConnection conn = factory.createQueueConnection();
//Crea la sessione sulla connessione appena creata
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//Recupero la coda (attraverso il nome JNDI)
javax.jms.Queue queue = (javax.jms.Queue)ctx.lookup("queue/ConsoleWriter");

//Creazione dell'oggetto che legge dalla coda
MessageConsumer consumer = session.createConsumer(queue);

conn.start();

//Ciclo infinito
while(true){
  Message msg = consumer.receive();
  System.out.println("Messaggio incoming: "+msg.toString());
  Thread.sleep(100);
}
...

Cambia l'ultima parte del codice, cioè la creazione dell'oggetto MessageConsumer e relativo ciclo per interrogare la coda sulla presenza di messaggi.

Ti consigliamo anche