MDB (Message Driven Bean) in 5 minuti

MDB: Cosa sono

Di solito le comunicazioni fra i componenti di un’applicazione sono sincrone, ossia l’oggetto che effettua la chiamata e l’oggetto che viene invocato devono essere entrambi presenti affinché la comunicazione possa avvenire.
Un message-oriented middleware (MOM) è un software che consente a due componenti di comunicare in maniera asincrona. Java Messaging Service (JMS) fornisce uno standard di accesso ai MOM che costituisce un’alternativa all’utilizzo di API proprietarie; ad eccezione di Microsoft Message Queuing, la maggior parte dei prodotti MOM infatti supporta JMS. Il client notifica una certa operazione al server inviando un messaggio (il client in questo caso è detto producer). Il server inserisce i messaggi in un canale sulla quale stanno in ascolto altri client che prelevano il messaggio ed eseguono le operazioni richieste (i componenti in ascolto vengono detti consumer).
Un modello di messaging definisce il modo in cui il processo di messaging coinvolge mittenti e destinatari. I due modelli più popolari, standardizzati in Java EE, sono il point-to-point e il pubish-subscribe.
Nello schema point to point il mittente (Producer) invia un messaggio verso una particolare destinazione. Il ricevente (Consumer) sta in ascolto e riceve i messaggi su quella destinazione(chiamata coda o queue). L’intento del producer è inviare un messaggio ad uno specifico consumer che sarà l’unico a riceverlo, anche se al momento dell’invio non è disponibile. (ci sarà solo un consumer per quella coda queue). Sarà infatti il JMS Broker (servizio che gestisce lo scambio dei messaggi) a tenerlo in coda finché non sarà prelevato dal consumer.
Nello schema publish-subscribe un singolo produttore invia un messaggio ad una destinazione ( che prende il nome di topic) e tutti i consumatori che sono registrati presso quel topic possono riceverlo. Questo modello lavora si adatta particolarmente bene nel caso in sui si voglia effettuare il broadcasting di informazioni verso diversi sistemi.
Un Message-Driven Bean (MDB) è un componente EJB che consuma messaggi da una queue/topic, inviati da un valido client JMS. Per crearlo è sufficiente usare l’annotation:

@MessageDriven

e implementare l’interfaccia MessageListener.

MDB: Esempio

Configurazione Server

La prima cosa da fare e avviare il server Wildfly con tutti i servizi startati. Per fare ciò Wildfly deve usare il file standalonefull.xml al posto di standalone.xml. Il modo più veloce per specificarlo, lavorando con eclipse, è andare nel tab “Servers” di JBoss Developer Studio, e cliccarci due volte sopra  ( si aprirà  la seguente schermata):

MDB

cliccare su “Runtime Environment” e scegliere standalone-full.xml invece di standalone.xml.

mdb java

Creazione coda sul server

Dentro standalone-full.xml aggiungere i  tag:
<jms-queue name=”HELLO” entries=”java:/queue/HELLO”/>

in questo modo verrà creata sul server una coda con nome JNDI “java:/queue/HELLO”

Creazione MDB

L’MDB rappresenta il consumer, ossia una classe che sta in ascolto su una determinata coda in attesa dell’arrivo di un messaggio. La coda è  specificata con l’annotation ActivationConfigProperty

MDBConsumer .java

[java]
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = “destinationType”, propertyValue = “javax.jms.Queue”),
@ActivationConfigProperty(propertyName = “destination”, propertyValue = “queue/HELLO”) })
public class MDBConsumer implements MessageListener {

/**
* @see MessageListener#onMessage(Message)
*/
public void onMessage(Message message) {
try {
System.out.println(“Messaggio ricevuto: ” + ((TextMessage) message).getText());
} catch (JMSException e) {
e.printStackTrace();
System.out.println(“Errore durante l’interpretazione del messaggio ” + message);
}
}
}

[/java]

Il consumer è  a questo punto creato. Resta da creare il producer. che spedisca un msg sulla coda “queue/HELLO”. Questo è fatto nel seguente file.

MDBProducer.java

[java]
import java.io.IOException;

import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Servlet implementation class MiaServelt
*/
@WebServlet(“/MDBProducer”)
public class MDBProducer extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public MDBProducer() {
super();
// TODO Auto-generated constructor stub
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
final String QUEUE_LOOKUP = “queue/HELLO”;
final String CONNECTION_FACTORY = “ConnectionFactory”;

try{
Context context = new InitialContext();

QueueConnectionFactory factory =
(QueueConnectionFactory)context.lookup(CONNECTION_FACTORY);

QueueConnection connection = factory.createQueueConnection();

QueueSession session =
connection.createQueueSession(false,
QueueSession.AUTO_ACKNOWLEDGE);

Queue queue = (Queue)context.lookup(QUEUE_LOOKUP);
QueueSender sender = session.createSender(queue);

//1. Sending TextMessage to the Queue
TextMessage message = session.createTextMessage();
message.setText(“Hello EJB3 MDB Queue!!!”);

sender.send(message);

session.close();
}catch(Exception e){e.printStackTrace();}

response.getWriter().append(“Served at: “).append(request.getContextPath());
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}

[/java]

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *